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

标签 c++ inheritance virtual-functions

#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/

相关文章:

javascript - AngularJS:多个工厂实例任何原型(prototype)继承

java - 与 C++ 相比,为什么在覆盖时不能缩小方法可见性?

c++ - 虚拟接口(interface)和封装

c++ - gcc3 和 gcc4 关于未初始化变量的区别

c++ - 如何定义递归可变参数宏?

c++ - 以编程方式检查头文件是否存在的最佳方法?

asp.net - 由于映射,EF 继承的对象插入失败

C++ 调试 "smell"

c++ - 标记为 `virtual final` 的基类方法是否会引入额外的开销?

c++ - c++库文件中局部常量是如何存储的