C ++调用从基类派生的覆盖函数

时间:2016-02-12 22:30:53

标签: c++ function inheritance polymorphism virtual

我有两个类AB,我需要在B中覆盖一个函数,以便从A的构造函数中调用。这是我已经拥有的:

class A {
    A(char* str) {
        this->foo();
    }

    virtual void foo(){}
}

class B : public A {
    B(char* str) : A(str) {}

    void foo(){
        //stuff here isn't being called
    }
}

如何从B::foo() {/ 1}} A::A()中调用代码?

3 个答案:

答案 0 :(得分:3)

我认为你指的是在初始化成语期间调用虚拟对象(在初始化期间称为动态绑定),所以请看一下这里解释所有内容:

  1. https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Calling_Virtuals_During_Initialization
  2. https://isocpp.org/wiki/faq/strange-inheritance#calling-virtuals-from-ctor-idiom
  3. 第二个网站有很好的解释,但它比第一个更长。

答案 1 :(得分:3)

  

我需要在B中覆盖一个从A的构造函数

调用的函数

这种设计在C ++中是不可能的:B对象的order of construction是首先构造基础A子对象,然后在其上构造B。

结果是,在A构造函数中,你仍在构造一个A对象:此时调用的任何虚函数都是A的函数。只有当A构造完成并且B构造开始时,才会B的虚函数变得有效。

为了达到你想要的效果,你必须使用两步模式:1)你构造对象,2)你初始化它。

答案 2 :(得分:1)

在构造函数中,将调用基类的函数,而不是被重写的版本。这样做的原因是,使用您的示例,B的构造函数被调用时A的初始化不完整,因此调用B的{​​{1}}会如果允许,则使用不完整的foo实例。