c++ 千万不要在构造或者析构中调用 virtual函数

参考 effective c++

假设我们写个模拟股市交易的类
这个类每创建一个对象 都必须写一个log

我们实现了个抽象类 因为不同的交易信息不同的log

class Transaction
{
public:
	Transaction()
	{
		log();
	}
	virtual void log()const = 0;
};

class BuyTransaction :public Transaction
{
public:
	virtual void log()const;
};

当我们执行

	BuyTransaction buy; 

会出现什么问题?

在这里插入图片描述

首先 编译器知道这样很危险 编译器是编译不过的 因为我们的 virtual 没有实现 所以在构造里不能调用

但是我们可以在上面封一层这样编译器就检测不出来了,比如下面

class Transaction
{
public:
	Transaction()
	{
		init();
	};

	void init()
	{
		log();
	}

	virtual void log()const = 0;
};

class BuyTransaction :public Transaction
{
public:
	virtual void log() const {};
};

加个init 函数 里面调用 log 虚函数 构造时调用 init 函数

这样执行会怎么样呢?

首先会调用父类的构造 然后 就会调用父类的log 这里就会出问题了!
这是调用的是父类的 log 还是 子类的log 函数呢?

虽然我们声明的是子类的对象 但是还是调用的父类的log 这里就很危险了
可能让你通宵调试

在这里插入图片描述

直接就崩溃了 还要感谢编译器

你声明一个子类对象 如果正常的运行 可能让你通宵调试 哈哈哈

记住:

千万不要在构造或者析构中调用 virtual函数 , 因为他不会从父类的这层虚函数下降至子类的虚函数

发布了178 篇原创文章 · 获赞 396 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/weixin_42837024/article/details/105077988
今日推荐