#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()
时到底发生了什么? - 为什么调用实例“B 部分”的
internal_init()
?这是关于“虚拟”的吗?如果是这样,怎么会?虚函数在我们使用多态性时发生(据我这样的初学者理解,它使用指向派生类对象的基类的指针)。
最佳答案
因为 instance
是一个 B
instance.internal_init();
将调用 B
的 internal_init()
。然后在 internal_init()
中调用 init();
。现在成员函数有一个隐式参数,即 this 指针。
所以当我们调用A
的init()
时,this指针实际上是一个B
。在 init()
中,我们使用指向 B
的 this 指针调用 internal_init();
。由于 internal_init()
是虚拟的并且我们有一个指向 B
的指针,因此虚拟查找机制将调用 B
的 internal_init()
.
这会再次循环并最终导致段错误或堆栈溢出。
关于c++ - 在不指向对象的情况下调用虚方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32588333/