我试图弄清楚如何将一个指向基类对象的动态指针数组传递给一个函数,该函数是一个指向父类对象的动态指针数组。我写了一个简单的代码,我不明白为什么它不起作用。将指针传递给父类的对象是没有问题的,也就是说,上转换可以正常工作。也许我不太明白如何转移,我想解释和/或更正。谢谢你。
class A
{
public:
virtual void run() = 0;
};
class B: public A
{
public:
void run() override
{
}
};
void test(A** a, size_t s) // приём динамического массива указателей на объекты базового класса
{
for (size_t i(0); i < s; ++i)
(*(a + i))->run();
}
void test2(A* a) // приём указателя на объект базового класса
{
a->run();
}
int main()
{
B** a = new B * [10]; // создаем динамический массив указателей на объекты родительского класса
B* b = new B; // создаем указатель на объект родительского класса
test(a, 10); // попытка передать динамический массив указателей на объекты родительского класса: ERROR
test2(b); // передача указателя на объект родительского класса: ОК
return 0;
}
有兴趣用于学习目的。
事实是,当这些类位于同一层次结构中时,可以将指向一个类的指针转换为指向另一类的指针(引用也是如此)。在示例中,它
B
继承自A
,因此B
可以将指针转换为指向 的指针A
,在这种简单的情况下,甚至不需要修改地址值。但是类型B *
不再A *
相关,并且在一般情况下,从另一个中获取一个并不是那么容易。让我用一个更具说明性的例子来说明:
这里
D
它继承自A
. 只需将地址增加 4 个字节D *
即可获得。A *
当你有一个数组时会发生什么
D *
?有了指向该数组第一个元素的指针,D * *
就无法从中获得地址转换A * *
。为此,您需要分配一个新的指针数组A *
并转换D *
原始数组中的每个指针。即使在简单的情况下,例如在您的示例中,指针地址匹配,添加重定向也会产生另一种阻止它们被转换的效果: