条款09:绝不在析构和构造中调用virtual函数

文章讨论了C++中如何避免在交易类构造期间调用虚函数logTransaction时遇到的未初始化问题,提供了三种解决方案:非虚化logTransaction、构造函数接收值参数并传递给logTransaction,以及在派生类中定义静态函数处理构造参数。
摘要由CSDN通过智能技术生成

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;
	}
};

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值