调用虚方法而不指向对象?

时间:2015-09-15 14:11:59

标签: c++ inheritance virtual-method

#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()?这是关于“虚拟”吗?如果是这样,怎么样?虚拟函数在我们使用多态时发生(就像我自己理解的初学者一样,它使用指向派生类对象的基类的指针)。

2 个答案:

答案 0 :(得分:7)

由于instanceB

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 Bstruct 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()