我正在尝试实现一些从基类继承其部分行为的派生类。 基类是这样的:
class Number {
public:
virtual string getName() = 0;
void writeName() {
string name = this->getName();
printf("My Name is %s\n", name.c_str());
}
Number() {
this->writeName();
}
};
class One : Number {
string getName() {return string("One");}
};
class Two : Number {
string getName() {return string("Two");}
};
int main() {
One *n = new One();
}
我希望这会输出“我的名字是一个”,但我得到一个例外,说'纯虚方法'。我是以错误的方式接近这个吗?或者我在课程和成员的声明中遗漏了什么,所以我实现了这个未被删除的结果?或者这实际上是预期的结果,如果是这样,我怎样才能实现我的需要呢?
答案 0 :(得分:3)
您会收到此异常,因为您正在构造函数内部调用该方法。根据C ++规则,类构造函数中的所有虚拟成员函数都被调度到类本身内的实现,而不是它的子类。这个决定背后的逻辑是,否则成员函数将在初始化完成之前在对象上运行。
没有解决方法:如果需要子类的构造函数来执行不同的操作,执行这些操作的代码应放在子类构造函数本身内。