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已定义。我需要在代码中进行哪些更改才能使其正常工作?我需要在其构造函数中调用基类中的纯虚方法。
答案 0 :(得分:13)
在构造函数中调用虚函数是recognised as a bad thing to do。
在派生类对象的基类构造期间,类型为 对象是基类的对象。不仅虚拟功能 解析到基类,但语言部分使用运行时 类型信息(例如,dynamic_cast(参见第27项)和typeid)处理 该对象作为基类类型。
因此,b
的实例化会调用a
构造函数。这会调用foo()
,但调用foo()
上的a
。而且(当然)未定义。
答案 1 :(得分:2)
引自Yashwant Kanetkar的一本书“Let Us C ++”
它始终是当前类的成员函数,被调用。那就是 是的,虚拟机制在构造函数
中不起作用
因此,foo()
的{{1}}被调用。
由于它被声明为class a
,因此会报告错误
答案 2 :(得分:1)
foo
函数在类a
的构造函数中调用,此时,对象b
尚未完全构造,因此它foo
{ {1}}实施不可用。
引自" Effective C ++":
在施工或毁坏期间不要调用虚拟功能, 因为这样的调用永远不会转到比派生类更多的派生类 当前正在执行的构造函数或析构函数