目前,我有每个孩子的构造函数中的图中所示的“大量代码”。我的目标是将它移动到父的构造函数。
答案 0 :(得分:10)
是否可以从抽象类构造函数中调用虚方法?
从技术上讲,这是可能的,但它不会像你期望的那样工作,所以不要这样做,因为尚未构建派生类的虚拟表。
当从构造函数调用虚函数时,将调用正在构造的类的实现,并且如果您调用的虚函数是纯函数,则会得到未定义的行为。
根据C ++ 11标准的第10.4 / 6段:
可以从抽象类的构造函数(或析构函数)调用成员函数;制作的效果 对正在创建(或销毁)的对象直接或间接虚拟调用(10.3)纯虚函数 来自这样的构造函数(或析构函数)是未定义的。
答案 1 :(得分:1)
如果您尝试从 FileContainer 构造函数中调用 initializeFiles(),它将调用 FileContainer :: initializeFiles()。这是因为派生类的构造函数尚未执行,因此尚未构建派生类的v表。
如果 FileContainer :: initializeFiles()是一个纯虚函数,那么你将会崩溃。