2013-02-12 119 views
4
class a //my base class 
{ 
public: 
    a() 
    { 
     foo(); 
    } 
    virtual void foo() = 0; 
}; 



class b : public a 
{ 
    public: 
    void foo() 
    { 
    } 
}; 

int main() 
{ 
    b obj; //ERROR: undefined reference to a::foo() 
} 

为什么它给我错误?纯虚拟foo被定义。我需要更改我的代码才能使其工作?我需要在其构造函数中调用基类的纯虚方法。在构造函数中调用纯虚函数给出错误

回答

13

在构造函数中调用虚函数是recognised as a bad thing to do

在派生类对象的基类构造过程中, 类型的对象是基类的对象。不仅虚拟函数 解析为基类,而且使用运行时类型信息(例如,dynamic_cast(请参阅项目27)和typeid)将该对象视为基类类型,而该语言的部分使用运行时 。

因此,您的实例化b调用a构造函数。这称为foo(),但是a上的foo()被调用。那(当然)是不确定的。

+0

我明白了。我会改变设计。 – user1873947 2013-02-12 11:12:02

+0

会使课堂抽象解决问题吗? – Falaque 2013-02-12 11:14:57

+0

@Falaque哪个班? – user1873947 2013-02-12 11:19:28

1

foo函数在类a的构造函数中被调用,并且此时对象b尚未完全构造,因此它的foo实现不可用。

从“有效的C++”引用:

不要叫建设或破坏, 期间虚函数,因为这样的电话将永远不会去比的 当前执行构造函数和析构函数更派生类

2

从一本书中引用了 “让我们C++”,由亚什万特Kanetkar

这是ALWA YS当前类的成员函数,是called.That ,虚拟机制不构造

所以,class afoo()被调用内工作。 由于它被宣布为pure virtual,它会报告一个错误

+0

它会报告错误...或者编译正常,但会导致UB,如果您幸运,会崩溃。无论哪种方式,不要这样做。 – 2016-07-03 00:40:25