我的示例代码如下:
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 :(得分:1)
根据C ++标准
可以调用4个成员函数,包括虚函数(10.3) 在施工或毁坏期间(12.6.2)。当一个虚函数 从构造函数或从构造函数直接或间接调用 析构函数,包括在构造或破坏期间 class的非静态数据成员,以及调用的对象 适用于建造或销毁的对象(称之为x), 被调用的函数是构造函数中的最终覆盖 析构函数的类,而不是在更派生的类中重写它。 如果虚函数调用使用显式类成员访问 (5.2.5)和对象表达式是指x的完整对象 或该对象的基类子对象之一,但不是x或其中一个 基类子对象,行为未定义。
和
可以从构造函数(或析构函数)调用6个成员函数 抽象类;进行虚拟呼叫(10.3)的效果 纯虚函数直接或间接用于对象 从这样的构造函数(或析构函数)创建(或销毁)是 未定义
因此,在您的示例中,当基类构造函数被调用时,它将依次调用其纯虚函数而不是派生类的overriden函数。根据标准的第二个引用,在这种情况下程序的行为是不确定的。