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 @ 2025-02-27 19:22  double64  阅读(19)  评论(0)    收藏  举报