C++ 注意派生类初始化基类的构造函数方式

class A
{
public:
	virtual ~A() {}
	int a{ 100 };
	int b{ 200 };
};

class B :public A
{
public:
	B() = default;
	B(const B&b)
		//:A(b)  // OK, 委托构造函数形式
	{
		A::A(b); // 这不行,创造了一个临时对象,a,b值没有受到影响
		c = b.c;
	}
	B& operator=(const B&b)
	{
		if (this == &b)
		{
			return *this;
		}
		A::operator=(b); // 可以的
		c = b.c;
		return *this;
	}

	int c{ 300 };
};

注意派生列的拷贝构造函数,应用改用委托构造函数的形式,不要像operator=拷贝赋值运算符一样,在函数内部调用了。拷贝赋值运算符在派生类拷贝赋值运算符内部调用时没有问题的。

int main()
{
	B b1;
	B b2;
	b2.c = 3;
	b2.b = 2;
	b2.a = 1;
	B b3(b2);
	cout << b3.a << " " << b3.b << " " << b3.c << '\n';

	b3 = b2;
	cout << b3.a << " " << b3.b << " " << b3.c << '\n';

	system("pause");
	return EXIT_SUCCESS;
}

输出:

100 200 3   
1 2 3
请按任意键继续. . .

从输出可见,b3 拷贝构造, a,b 的值没有受到影响,用 委托构造函数形式 是可以的。赋值运算符没有问题。

posted @   double64  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2024-02-27 C# 简单反射加载 DLL 实例
点击右上角即可分享
微信分享提示