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

最近更新

  1. TCP协议是安全的吗?

    2024-03-17 02:04:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-17 02:04:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-17 02:04:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-17 02:04:03       20 阅读

热门阅读

  1. 远程过程调用-buttonrpc源码解析1-序列化

    2024-03-17 02:04:03       18 阅读
  2. git reset

    2024-03-17 02:04:03       22 阅读
  3. 2、计划任务不显示UI的问题

    2024-03-17 02:04:03       18 阅读
  4. 什么是UUID?

    2024-03-17 02:04:03       25 阅读
  5. Vue v-if 和 v-show的区别

    2024-03-17 02:04:03       21 阅读
  6. openssl3.2 - exp - generate ecc priv key

    2024-03-17 02:04:03       21 阅读
  7. PyTorch入门

    2024-03-17 02:04:03       20 阅读