当组织继承结构并需要使基类抽象时,是否有理由优先选择纯虚析构函数而不是受保护的构造函数(或反之亦然)?这个问题已经在这里存在,但被接受的答案并没有真正回答它。
Base *ptr = new Derived();
delete ptr;
这两种方法都可以解决问题:
- 将析构函数设为纯虚函数并定义其内容
- 将析构函数设为虚函数并将构造函数设为保护的
据我所知,唯一不同的是,在尝试Base *ptr = new Base()
时编译器报错的情况:
在第一种情况下是Cannot instantiate abstract class
,而在第二种情况下是Cannot access protected member
,前者更为准确。这是一种风格问题,还是我有不了解的地方?
另外一个相关的问题是,是否会对继承链中不严格属于基类但仍应该是抽象的某个类应用相同的规则(例如,Monster
从GameObject
继承而来,不能被创建,但从Monster
继承而来的Orc
则可以)?