#include <iostream>
struct A {
void init()
{
internal_init();
}
virtual void internal_init()
{
std::cout << "internal of A" << std::endl;
}
};
struct B: public A {
void internal_init()
{
init();
std::cout << "internal of B" << std::endl;
}
};
int main(){
B instance;
std::cout << "internal of A" << std::endl;
instance.internal_init();
return 0;
}
首先,程序按预期转到B::internal_init()
。
然后,到A::init()
(我猜是因为B来自A,而B没有任何init()
)。
现在怎么样?
它会选择哪个internal_init()
?因为它进入B::internal_init()
,程序将进入无限循环,我不明白为什么。
internal_init()
时会发生什么?internal_init()
?这是关于“虚拟”吗?如果是这样,怎么样?虚拟函数在我们使用多态时发生(就像我自己理解的初学者一样,它使用指向派生类对象的基类的指针)。答案 0 :(得分:7)
由于instance
是B
instance.internal_init();
将致电B
s internal_init()
。然后在internal_init()
中拨打init();
。现在,成员函数有一个隐含参数,即this指针。
因此,当我们致电A
&#39; init()
时,此指针实际上是B
。在init()
中,我们使用指向internal_init();
的指针调用B
。由于internal_init()
是虚拟的,并且我们有一个指向B
的指针,因此虚拟查找机制将调用B
&#39; internal_init()
。
然后再次循环,最终会导致段错误或堆栈溢出。
答案 1 :(得分:2)
首先struct B
因struct A
而继承struct B: public A
的所有功能。 internal_init
中的A
函数被B
覆盖,因为您在virtual
中使用相同的函数签名和关键字A
。
所以现在的电话是:
instance.internal_init();
调用internal_init()
的{{1}},调用B
,调用A::init
等,直到给出分段错误。
为了防止这种情况(我认为这是您想要的),您可以在B::internal_init()
中明确调用internal_init()
A
而不是调用B
:
init()