本文主要是介绍条款09:绝不在析构和构造中调用virtual函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.为什么
#include<iostream>
using namespace std;class Transaction//交易信息类
{Transaction();virtual void logTransaction()const = 0;//交易日志
};Transaction::Transaction()
{logTransaction();
}class BuyTransaction : public Transaction//买入操作
{virtual void logTransaction()const{cout << "BuyTransaction" << endl;}
};class SellTransaction : public Transaction//卖出操作
{virtual void logTransaction()const{cout << "SellTransaction" << endl;}
};int main()
{BuyTransaction b;
}
上述代码的本意是,每当进行买入或卖出时,都会创建买入的操作日志或者卖出的操作日志
但是当BuyTransaction对象b创建的时候,会先调用Transaction的构造函数,构造函数去调用logTransaction(),因为这个时候BuyTransaction对象的成员全部未初始化,如果调用BuyTransaction的成员函数,势必要使用BuyTransaction的成员变量,使用未初始化的变量,C++肯定会制止这种行为。
派生类的对象在构造期间是基类,BuyTransaction构造时,当他的专属成分未被初始化的时候,BuyTransaction会被看作Transaction,
2.怎么办
1.将logTransaction()定义为非虚函数
2.将值传给Transaction的构造函数
3.在派生类定义一个静态的函数,把Transaction的构造函数的参数传值给logTransaction(),这样就不会出现未初始化的问题。
class Transaction
{
public:Transaction( string& s);void logTransaction(string & s);
};Transaction::Transaction( string& s)
{logTransaction(s);
}class BuyTransaction : public Transaction
{BuyTransaction(log):Transaction(createlogTransaction(log)){}private:static string &createlogTransaction(s){return s;}
};
这篇关于条款09:绝不在析构和构造中调用virtual函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!