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 的值没有受到影响,用 委托构造函数形式 是可以的。赋值运算符没有问题。