在构造函数中调用纯虚函数给出错误
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被定义。我需要更改我的代码才能使其工作?我需要在其构造函数中调用基类的纯虚方法。在构造函数中调用纯虚函数给出错误
在构造函数中调用虚函数是recognised as a bad thing to do。
在派生类对象的基类构造过程中, 类型的对象是基类的对象。不仅虚拟函数 解析为基类,而且使用运行时类型信息(例如,dynamic_cast(请参阅项目27)和typeid)将该对象视为基类类型,而该语言的部分使用运行时 。
因此,您的实例化b
调用a
构造函数。这称为foo()
,但是a
上的foo()
被调用。那(当然)是不确定的。
foo
函数在类a
的构造函数中被调用,并且此时对象b
尚未完全构造,因此它的foo
实现不可用。
从“有效的C++”引用:
不要叫建设或破坏, 期间虚函数,因为这样的电话将永远不会去比的 当前执行构造函数和析构函数更派生类
从一本书中引用了 “让我们C++”,由亚什万特Kanetkar
这是ALWA YS当前类的成员函数,是called.That ,虚拟机制不构造
所以,class a
的foo()
被调用内工作。 由于它被宣布为pure virtual
,它会报告一个错误
它会报告错误...或者编译正常,但会导致UB,如果您幸运,会崩溃。无论哪种方式,不要这样做。 – 2016-07-03 00:40:25
我明白了。我会改变设计。 – user1873947 2013-02-12 11:12:02
会使课堂抽象解决问题吗? – Falaque 2013-02-12 11:14:57
@Falaque哪个班? – user1873947 2013-02-12 11:19:28