1 继承关系中的拷贝构造函数和赋值操作重载函数分析
在继承关系中,如果子类未实现拷贝构造函数,那么在子类进行拷贝构造操作时,会直接调用父类的拷贝构造函数,如果父类的拷贝构造函数是私有的,则会编译失败。我们有时候也会故意把父类的拷贝构造函数设置为私有的,从而禁止子类的拷贝构造操作。
在继承关系中,如果子类未实现赋值操作重载函数,那么在子类进行赋值操作时,会直接调用父类的赋值操作重载函数,如果父类的赋值操作重载函数是私有的,则会编译失败。我们有时候也会故意把父类的赋值操作重载函数设置为私有的,从而禁止子类进行赋值操作。
如下代码:
class A
{
public:
A()
{
cout << "A()" << endl;
}
A(const A& obj)
{
cout << "A(const A& obj)" << endl;
}
A& operator = (const A& obj)
{
cout << "A& operator = (const A& obj)" << endl;
return *this;
}
};
class B : public A
{
};
int main()
{
B b1;
B b2(b1);
b1 = b2;
return 0;
}
输出结果:

一旦子类实现了拷贝构造函数,则在拷贝构造的时候会调用子类的拷贝构造函数和父类的构造函数。子类实现了赋值操作重载函数,则只会调用子类的。
代码如下:
class A
{
public:
A()
{
cout << "A()" << endl;
}
A(const A& obj)
{
cout << "A(const A& obj)" << endl;
}
A& operator = (const A& obj)
{
cout << "A& operator = (const A& obj)" << endl;
return *this;
}
};
class B : public A
{
public:
B()
{
cout << "B()" << endl;
}
B(const B& obj)
{
cout << "B(const B& obj)" << endl;
}
B& operator = (const B& obj)
{
cout << "B& operator = (const B& obj)" << endl;
return *this;
}
};
int main()
{
B b1;
B b2(b1);
b1 = b2;
return 0;
}
执行结果如下:

本文深入分析了在继承关系中,拷贝构造函数和赋值操作重载函数的调用机制。当子类未实现这些函数时,会调用父类的相关函数。若父类函数为私有,则会导致编译失败。文章通过具体代码示例展示了如何通过子类实现这些函数来控制对象的拷贝和赋值行为。
398

被折叠的 条评论
为什么被折叠?



