抽象和纯虚拟方法

Abstraction and Pure virtual methods

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

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

我希望这会输出 "My Name is One",但我得到一个异常 'pure virtual method called'。我是以错误的方式接近这个吗?还是我在 classes 和成员的声明中遗漏了一些东西,所以我得到了这个意外的结果?或者这实际上是预期的结果,如果是这样,我怎样才能达到我需要的效果?

你得到这个异常是因为你从构造函数内部调用方法。根据 C++ 规则,class 构造函数中的所有虚拟成员函数都被分派到 class 本身内部的实现,而不是其子 class 内部的实现。这个决定背后的逻辑是,否则成员函数将在对象初始化完成之前 运行 在对象上。

对此没有解决方法:如果您需要 subclasses 的构造函数来执行不同的操作,执行这些操作的代码应该放在 subclass 构造函数本身中。