假设你有一个class继承体系,用来模拟股市交易的订单等。如下:
class Transawction { //所有交易的base class
public:
Transaction();
virtual void logTransaction() const = 0; //做出一份因类型不同而不同的日志记录
....
};
Transaction::Transaction() //base class构造函数的实现
{
...
logTransaction(); //最后动作是志记这笔交易,问题出在这
}
class BuyTransaction::public Transawction { //derived class
public:
virtual void logTransaction() const; //志记此型交易
};
class SellTransaction::public Transawction { //derived class
public:
virtual void logTransaction() const; //志记此型交易
};
现在有这样的代码:
BuyTransaction b;
先要调有基类的构造函数,但是这个函数调用了一个logTransaction函数。要注意这个logTransaction函数是基类中的版本,而不是派生类中的版本。同时在base class构造期间,对象的作为就像它本身就是base类型一样。
C++编译器规定在derived class对象和base class构造期间,对象的类型是base class而不是derived class。不只是virtual函数会被编译器解析至base class,同时对象被视为base class类型。在本例中,当Transaction构造函数正执行起来初始化BuyTransaction对象中的base class成分时,该对象的类型是Transaction。对象在derived class构造函数开始中执行前不会成为一个derived class对象。
同样的道理也适用于析构函数。
总结:确定你的构造函数和析构函数都没有(在对象被创建和被销毁期间)调用virtual函数,而它们调用的所有函数也都不能调用的任何的virtual函数。
Effective C++读书笔记之绝不在构造和析构过程中调用virtual函数
最新推荐文章于 2023-01-15 18:16:01 发布