2014-02-23 103 views
0

我的示例代码如下:如何访问基类中的派生类纯虚拟实现?

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

我不能够理解我的错误在这里,请帮助。 有没有解决方法来实现我想要的。

+0

[pure virtual function with implementation]的可能重复(http://stackoverflow.com/questions/2089083/pure-virtual-function-with-implementation) – OMGtechy

+1

您不能从构造函数调用(派生类的)虚函数,期限! –

+3

你误解了'规则'。该规则是,你不能从调用构造函数[或析构]纯虚函数直接_or indirectly_正在创建[或破坏]的对象。你在这里的额外间接没有任何区别。 –

回答

1

根据C++标准

4的成员函数,包括虚拟功能(10.3),可称为施工或破坏(12.6.2)中 。当从构造函数或 析构函数直接或间接调用虚函数 时,包括在构造或销毁类的非静态数据成员期间以及调用 所应用的对象是对象(称之为x)正在构建或销毁, 所调用的函数是构造函数或 析构函数的类中的最终覆盖,而不是覆盖更多派生类中的函数。 如果虚函数调用使用显式类成员访问 (5.2.5),并且对象表达式引用x 的完整对象或该对象的基类子对象之一,但不包含x或其 基类子对象之一,行为是不确定的。

6成员函数可以从 一个抽象类的构造(或析构函数)被调用;使得虚拟呼叫(10.3)到 纯虚拟函数直接或间接地用于该目的在于 从这样的构造(或析构函数)创建(或破坏)的效果是 未定义

所以在您的示例当基类构造函数将被调用它反过来将调用它的纯虚函数不是派生类的被覆盖的功能。根据该标准的第二个引用,该程序在这种情况下的行为是未定义的。