相关疑难解决方法(0)

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

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

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++解决方案搞得一团糟?

感谢大家的帮助.

c++ abstract-class const pure-virtual

4
推荐指数
1
解决办法
1万
查看次数

标签 统计

abstract-class ×1

c++ ×1

const ×1

pure-virtual ×1