C ++赋值运算符有关继承的问题

时间:2011-04-26 05:56:40

标签: c++ inheritance assignment-operator

我有两个类 - 基类A和派生类B - 我写这个

A obj;  
B obj2;  
obj = obj2;  

如果我还没有覆盖任何分配操作员,会发生什么?这只是将obj2的A部分复制到obj中吗?这甚至是正确的,还是编译器只是借口的错误? IS_A关系是否允许执行此语句?任何帮助是极大的赞赏。

5 个答案:

答案 0 :(得分:1)

这当然是允许的。它会将A的{​​{1}}子对象分配给obj2

由于IS-A关系,在编译时几乎不可能阻止这种情况,也不会阻止从A实例的赋值。

答案 1 :(得分:1)

它会浅显复制obj2的“A”部分。

从语言的角度来看,这是完全可以的。

如果你的应用程序没问题,这取决于很多因素,但这就是你可以重载赋值运算符的原因。

答案 2 :(得分:1)

class Base
{
    //Members       
};

class Derived1:public Base
{
    //Members
};

class Derived2:private Base
{
    //Members 
};


int main()
{
    Base obj1;
    Derived1 obj2;
    Derived2 obj3;

    obj1 = obj2;   //Allowed Since Public Inheritance 
    obj1 = obj3;   //Not Allowed, Compiler generates error
}

obj1 = obj2仅将从Base Class继承的Derived Class obj2的成员复制到obj1时,Derived Class的其余成员将被切掉。这只是因为Base类obj1不知道Derived类的成员。这个现象被称为Object Slicing

如果类具有需要在Heap上分配的指针成员变量,则obj1 = obj2创建Shallow Copy,这意味着obj1和obj2中的指针成员变量现在将指向相同的堆内存。那么如果操作系统回收obj2并且obj1仍在使用中会发生什么?灾害!因此overloading = operator应该避免使用浅层副本并制作Deep copy个对象。

答案 3 :(得分:0)

重载您的赋值运算符。并且在实现B中,将分配A部分中的部分......在尝试分配A中存在的B的值之前,不会生成编译器错误

答案 4 :(得分:0)

A::operator=(const A& value);

将被执行。 obj1隐式地将(static_cast)强制转换为const A&

所以你的obj=obj1;等同于

obj = static_cast<const A&>(obj1);

显然,隐式生成的赋值将分配A的每个非静态成员。

拒绝使用私有/受保护的继承。通过使用公共继承,您声称所有类型为B的对象都可以以各种可能的方式合法地用作类型A的对象。

您也可以明确声明

A& A::operator=( const B& value );

或者您也可以定义

A& A::operator=( const A& value );

以多态方式行事。