gpt4 book ai didi

c++ - 在不指向对象的情况下调用虚方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:13 24 4
gpt4 key购买 nike

#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();

将调用 Binternal_init()。然后在 internal_init() 中调用 init();。现在成员函数有一个隐式参数,即 this 指针。

所以当我们调用Ainit()时,this指针实际上是一个B。在 init() 中,我们使用指向 B 的 this 指针调用 internal_init();。由于 internal_init() 是虚拟的并且我们有一个指向 B 的指针,因此虚拟查找机制将调用 Binternal_init().

这会再次循环并最终导致段错误或堆栈溢出。

关于c++ - 在不指向对象的情况下调用虚方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32588333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com