抽象和纯虚拟方法

时间:2015-01-08 11:08:54

标签: c++ inheritance polymorphism

我正在尝试实现一些从基类继承其部分行为的派生类。 基类是这样的:

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();
}

我希望这会输出“我的名字是一个”,但我得到一个例外,说'纯虚方法'。我是以错误的方式接近这个吗?或者我在课程和成员的声明中遗漏了什么,所以我实现了这个未被删除的结果?或者这实际上是预期的结果,如果是这样,我怎样才能实现我的需要呢?

1 个答案:

答案 0 :(得分:3)

您会收到此异常,因为您正在构造函数内部调用该方法。根据C ++规则,类构造函数中的所有虚拟成员函数都被调度到类本身内的实现,而不是它的子类。这个决定背后的逻辑是,否则成员函数将在初始化完成之前在对象上运行。

没有解决方法:如果需要子类的构造函数来执行不同的操作,执行这些操作的代码应放在子类构造函数本身内。