Item 9 避免在ctor和dtor中调用虚函数

看下面的程序有什么问题。

 

class Transaction { public: Transaction(); virtual void logTransaction() const = 0; // 实际的日志记录在派生类里实现。我们的本意是根据不同的类生成不同的日志 ... }; Transaction::Transaction() { ... logTransaction(); // 但是,此处会调用派生类的实现吗? } class BuyTransaction: public Transaction { public: virtual void logTransaction() const; ... }; class SellTransaction: public Transaction { public: virtual void logTransaction() const; ... };

 

在基类的构造过程中,虚函数调用不会被传递到派生类中。因为基类的ctor是在派生类之前执行的,这时其数据成员还没有被初始化,即,派生对象还不存在!所以C++拒绝这样做。
不止虚函数,使用到RTTI的部分(dynamic_cast和typeid),在基类的ctor里,都不会被解析成派生类。
ctor和dtor同样。
一些编译器会对此给出警告。

 

● 注意,还有一种隐藏版本:

 

class Transaction { public: Transaction() { init(); // init里面调用了虚函数。同样不行! } virtual void logTransaction() const = 0; ... private: void init() { ... logTransaction(); } };

 

● 如果非要在基类里实现这样的功能,怎么办?下面是一种办法。

 

class Transaction { public: explicit Transaction(const std::string& logInfo); void logTransaction(const std::string& logInfo) const; ... }; Transaction::Transaction(const std::string& logInfo) { ... logTransaction(logInfo); } class BuyTransaction: public Transaction { public: BuyTransaction( parameters ) : Transaction(createLogString( parameters )) { ... } ... private: static std::string createLogString( parameters ); };

你可能感兴趣的:(Item 9 避免在ctor和dtor中调用虚函数)