是否可以从抽象类构造函数中调用虚方法?

时间:2013-05-05 10:06:59

标签: c++ oop

class diagram

目前,我有每个孩子的构造函数中的图中所示的“大量代码”。我的目标是将它移动到父的构造函数。

2 个答案:

答案 0 :(得分:10)

  

是否可以从抽象类构造函数中调用虚方法?

从技术上讲,这是可能的,但它不会像你期望的那样工作,所以不要这样做,因为尚未构建派生类的虚拟表。

当从构造函数调用虚函数时,将调用正在构造的类的实现,并且如果您调用的虚函数是纯函数,则会得到未定义的行为。

根据C ++ 11标准的第10.4 / 6段:

  

可以从抽象类的构造函数(或析构函数)调用成员函数;制作的效果   对正在创建(或销毁)的对象直接或间接虚拟调用(10.3)纯虚函数   来自这样的构造函数(或析构函数)是未定义的。

答案 1 :(得分:1)

如果您尝试从 FileContainer 构造函数中调用 initializeFiles(),它将调用 FileContainer :: initializeFiles()。这是因为派生类的构造函数尚未执行,因此尚未构建派生类的v表。

如果 FileContainer :: initializeFiles()是一个纯虚函数,那么你将会崩溃。