在多态操作中,我们不能在析构函数和构造函数中调用虚函数,因为在基类构造和析构期间,我们不能调用派生类的函数,也就是说,构造和析构期间的虚函数不在是虚函数。
考虑以下代码:
上述代码我们想要在构造基类的时候调用派生类logTransaction(),但是这并不会实现,实际将会调用基类的函数,这种情况下实际派生类的logTransaction()还未初始化,因为编译器总是会在派生类之前初始基类成员,因此编译器没办法找到基类的函数调用,所以只能调用父类的函数,而父类的函数为纯虚函数,因而编译器将会发生连接错误。
因而,在调用基类的构造期间,对象的类型将会是基类,而非派生类,不仅仅是虚函数会被解析为基类的虚函数,包括dynamic_cast、dypeid等的解析结果也会将其解析为基类。 同样,这也适合析构函数,一旦基类的析构开始,派生类的对象将会表现为未定义行为。
考虑如下代码:
如果间接的在构造函数种调用虚函数,那也是不行的,而这种情况编译器并不会报错,编译器会调用错误版本的虚函数,而这种错误往往让人很难发现。
解决方案:
我们可以向父类中传递我们想要记录的日志信息,然后将函数定义为非虚函数。
代码如下:
也就是说,因为我们不能在构造函数期间向下调用虚函数,因此我们采用向上传递信息的方式实现我们想要的操作。