为什么纯虚拟/抽象类需要构造函数,特别是对于受保护的const成员变量?

tic*_*ter 4 c++ abstract-class const pure-virtual

我有一个纯粹的虚拟类定义如下:

class BaseClass {
 protected:
  const int var;
 public:
  void somefun() = 0; // what I mean by a purely virtual class
  // stuff...
};
Run Code Online (Sandbox Code Playgroud)

如果我不添加如此定义的构造函数:

BaseClass(const int & VAR) : var(VAR) {};
Run Code Online (Sandbox Code Playgroud)

我必须在随后的派生类中使用,我的派生类不能将const变量var初始化为它想要的任何值.现在我真的明白这里发生了什么.在构造派生类之前,会调用基类的构造函数,此时必须初始化const成员变量.我的问题不是"如何使我的代码工作"这样的问题,这已经完成了.我的问题是为什么编译器认为这是必要的.对于纯粹的虚拟课程,我不应该被允许写下这样的内容:

class DerivedClass : BaseClass {
 public:
  DerivedClass() : var(SOME_VALUE) {};
}
Run Code Online (Sandbox Code Playgroud)

如果编译器知道对BaseClass构造函数的调用必然会跟随对某个派生类构造函数的调用(因为抽象类型的对象永远不能被实例化),它不应该给我们更多的回旋余地吗?

这是否是C++选择解决Diamond问题的结果?即使是这种情况,编译器是否应该至少以某种方式允许在派生类中定义纯虚函数的const成员变量的可能性?这太复杂了还是钻石问题的C++解决方案搞得一团糟?

感谢大家的帮助.

Mik*_*our 5

它不是"纯粹的虚拟"(无论你的意思是什么) - 它包含一个数据成员.

类成员只能由该类的构造函数的初始化列表初始化,而不能由派生类初始化.这就是指定对象初始化的方式:初始化的所有成员在构造函数体开始之前初始化.

必须初始化常量对象,因为以后无法为它们分配值.

因此,具有常量数据成员的类必须在每个构造函数中初始化它.