如何在基类中访问派生类纯虚拟实现?

时间:2014-02-23 13:42:24

标签: c++

我的示例代码如下:

class Base {
public:
    Base() { callVirtualfunc(); } 

    virtual void funca() = 0;

    void callVirtualfunc() { funca(); }
};
// -----------------------------------------
class Derived : public Base{
public:
    Derived() : Base() {}

    void funca() { cout<<"Hello world"<<endl; }
};

我明白我不能在构造函数/析构函数中调用纯虚函数。我在函数callVirtualfunc()中调用它们。 我得到了:: C++ runtime abort: an undefined pure virtual function was called

我这样做是为了:

  • 强制执行所有派生类以实现funca()
  • 我还想保证派生类可以调用funca()

我无法理解我的错误,请帮忙。 是否有解决方法来实现我想要的目标。

1 个答案:

答案 0 :(得分:1)

根据C ++标准

  

可以调用4个成员函数,包括虚函数(10.3)   在施工或毁坏期间(12.6.2)。当一个虚函数   从构造函数或从构造函数直接或间接调用   析构函数,包括在构造或破坏期间   class的非静态数据成员,以及调用的对象   适用于建造或销毁的对象(称之为x),   被调用的函数是构造函数中的最终覆盖   析构函数的类,而不是在更派生的类中重写它。   如果虚函数调用使用显式类成员访问   (5.2.5)和对象表达式是指x的完整对象   或该对象的基类子对象之一,但不是x或其中一个   基类子对象,行为未定义。

  

可以从构造函数(或析构函数)调用6个成员函数   抽象类;进行虚拟呼叫(10.3)的效​​果   纯虚函数直接或间接用于对象   从这样的构造函数(或析构函数)创建(或销毁)是   未定义

因此,在您的示例中,当基类构造函数被调用时,它将依次调用其纯虚函数而不是派生类的overriden函数。根据标准的第二个引用,在这种情况下程序的行为是不确定的。