条款09:绝不在构造和析构过程中调用 virtual 函数
Never call virtual functions during construction or destruction.
本条款重点:不该在构造函数和析构函数期间调用 virtual 函数。
derived class 对象内的 base class 成分会在 derived class 自身成分被构造之前先构造妥当,此时如果 base class 的构造函数中调用了 virtual 函数,该 virtual 函数是 base class 版本的,而非 derived class 的。这种现象的根本原因在于,在 derived class 对象中的 base class 构造期间,对象类型是 base class 而不是 derived class。不过好在某些编译器会发出警告。
潜在的调用 virtual 函数问题
如果 base class 有多个构造函数,每个都需要执行某些相同的工作,那么为了避免重复的代码,需要将共同初始化代码放进一个初始化函数中,如果此时在初始化函数中调用了 virtual 函数,编译器和连接器是不会有提示的。
解决办法
首先,可以让构造函数和析构函数都不去调用 virtual 函数,以避免这种问题。
其次,如果无法避免,可以将函数改为 non-virtual,然后要求 derived class 构造函数传递必要信息给 base class 的构造函数。
这里使用 private static 函数的作用在于避免了意外指向“初期未成熟的 derived class 对象内部尚未初始化的成员变量”。
Last updated
Was this helpful?