【为什么】我可以从构造函数中调用虚函数吗?C++之父谈

此文为C++之父撰写,本篇为翻译

是的,但要小心。 它可能不会做你期望的。 在构造函数中, 虚拟调用机制被禁用,因为从派生覆盖 课程还没有发生。 对象是从基础向上构建的, “派生前的基础”。

考虑到

#include<string>
	#include<iostream>
	using namespace std;

	class B {
	public:
		B(const string& ss) { cout << "B constructor\n"; f(ss); }
		virtual void f(const string&) { cout << "B::f\n";}
	};

	class D : public B {
	public:
		D(const string & ss) :B(ss) { cout << "D constructor\n";}
		void f(const string& ss) { cout << "D::f\n"; s = ss; }
	private:
		string s;
	};

	int main()
	{
		D d("Hello");
	}

程序编译并生成

B constructor
B::f
D constructor

注意 不是 D::f。 考虑如果规则不同会发生什么 D::f() 是 从 B::B() 调用:因为构造函数 D:: D() 尚未运行, D::f() 会尝试将其参数分配给未初始化的字符串 s。 结果很可能是立即崩溃。

破坏是“在基类之前的派生类”完成的,因此虚函数 与构造函数中的行为相同:仅使用局部定义 - 不使用 调用重写函数以避免触及(现已销毁) 对象的派生类部分。

有关详细信息,请参阅 D&E 13.2.4.2 或 TC++PL3 15.4.3。

有人建议此规则是一个实现工件。 这是 不是这样。 事实上,实施不安全规则会容易得多 从构造函数中调用虚函数与​​从其他函数中调用虚函数完全一样。 但是,这意味着不能编写任何虚函数来依赖 关于由基类建立的不变量。 那将是一团糟。

注意:可以结合这篇文章来看https://www.cnblogs.com/wozhuyinghao/p/17148698.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值