条款09:绝不在构造和析构过程中调用virtual函数
2017-09-21 17:04
567 查看
看下面例子
class Transaction { public: Transaction(); virtual void logTransaction() const = 0; }; void Transaction::logTransaction() const { cout << "logTransaction\n"; } class BuyTransaction :public Transaction { public: virtual void logTransaction() const { cout << "BuTransaction\n"; } }; class SellTransaction :public Transaction { public: virtual void logTransaction() const { cout << "SellTransaction\n"; } }; BuyTransaction b /*Transaction构造函数在BuyTransaction的构造函数之前调用, Transaction构造函数里面调用了logTransaction函数,但是 调用的是Transaction内的版本,也就是说base class构造期间virtual 函数不会下降到derived class阶层。 */
上述代码进行编译的时候会出现连接错误因为logTransaction函数没有被实现,在Transaction类外添加如下代码后,出现的运行结果为
void Transaction::logTransaction() const { cout<<"logTransaction\n"; }
解决这个问题的办法是将class Transaction内的logTransactio函数改为non-virtual,然后要求derived class构造函数传递必要信息给Transaction构造函数。
class Transaction { public: explicit Transaction(const string& logInfo); void logTransaction(const string& logInfo); }; void Transaction::logTransaction(const string& str) { cout << str << endl; } Transaction::Transaction(const string& logInfo) { logTransaction(logInfo); } class BuyTransaction :public Transaction { public: BuyTransaction(string str) :Transaction(createLogString(str)) { cout << "BuyTransaction\n"; } static string createLogString(string str) { cout << "createLogString\n"; return str; } }; BuyTransaction B("123");
相关文章推荐
- 条款09:绝不在构造和析构过程中调用virtual函数
- 条款09:绝不在构造和析构过程中调用virtual函数
- 条款09:绝不在构造和析构过程中调用virtual函数
- 条款09:绝不在构造和析构过程中调用virtual函数
- Effective C++ 条款09:绝不在构造和析构过程中调用virtual函数
- Effective C++ -----条款09:绝不在构造和析构过程中调用virtual函数
- 读书笔记《Effective C++》条款09:绝不在构造和析构过程中调用virtual函数
- 条款09:绝不在构造和析构过程中调用virtual函数
- 条款09:绝不在构造和析构过程中调用virtual函数
- 《Effect C++》学习------条款09:绝不在构造和析构过程中调用virtual函数
- Effective c++学习笔记——条款09:绝不在构造和析构过程中调用virtual函数
- Effective c++学习笔记——条款09:绝不在构造和析构过程中调用virtual函数
- Effective C++:条款09:绝不在构造和析构过程中调用virtual函数
- 条款09:绝不在构造和析构过程中调用virtual函数
- 条款09:绝不在构造和析构过程中调用virtual函数(Never call virtual functions during construction or destruction.)
- 条款09:绝不再构造和析构过程中调用virtual函数
- Effective C++ 条款9:绝不在构造和析构过程中调用virtual函数
- Effective C++_笔记_条款09_绝不在构造和析构过程中调用virtual函数
- 条款:09绝不再构造和析构过程中的调用virtual函数
- 条款09 绝不在构造和析构过程中调用virtual函数