Effective C++ 条款09 绝不在构造和析构过程中调用virtual函数

本条款的内容主要讲述了在子类和父类之间的构造和析构阶段不要去调用virtual函数,因为那可能会和你预想的结果有出入。

class Transportion
{
Transportion();
virtual void logTransction()const = 0;//纯虚函数
};
Transportion::Transportion()
{
   //........
logTransction();
}
class BuyTransction :public Transportion {
public:
virtual void logTransction() const;
//...........
};
class sellTransction :public Transportion
{
public:
virtual void logTransction() const;
};

现在当 BuyTransction b;执行会发生什么?

答:无疑会有一个BuyTransction构造函数被调用,但首先Transction构造函数一定会更早调用;因为构造函数的调用顺序是从最内层的阶段开始的,析构函数则相反。Transction构造函数的最后一行调用virtual函数logTransction,问题出现了——这时候调用的logTransction并不是BuyTransction版本的而是Transction的,即使你建立的是一个BuyTransction对象。是的,基类构造期间virtual函数绝不会下掉到派生类的层次。取而代之的是对象的行为就像是隶属基类类型一样。

    如果在基类构造期间调用的virtual函数下降到了派生类阶层,而派生类的函数几乎必然会用到local变量,而那些成员变量尚未初始化。这将会使你误用对象未初始化的部分。

   其根本原因:在派生类对象的基类构造期间对象的类型是基类而不是派生类。对象在派生类构造函数开始执行前不会成为一个派生类对象。

猜你喜欢

转载自blog.csdn.net/qq_31984717/article/details/79107390