0

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

A obj;  
B obj2;  
obj = obj2;  

如果我还没有覆盖任何分配运算符,实际上会发生什么?这是否只是将 obj2 的 A 部分复制到 obj 中?这是正确的,还是编译器只是原谅的错误?IS_A 关系是否允许执行此语句?任何帮助是极大的赞赏。

4

5 回答 5

1

这当然是允许的。它将分配to的A子对象。obj2obj

由于 IS-A 关系,几乎不可能在编译时阻止这种情况,而不防止从 A 的实例分配。

于 2011-04-26T06:01:06.653 回答
1

它会浅拷贝 obj2 的“A”部分。

从语言的角度来看,这完全没问题。

如果它适合您的应用程序,这取决于许多因素,但这就是您可以重载赋值运算符的原因。

于 2011-04-26T06:01:32.000 回答
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只有从基类继承的派生类 obj2 的那些成员被复制到 obj1 中时,派生类的其余成员将被切掉。这仅仅是因为基类 obj1 不知道派生类的成员。这种现象称为Object Slicing

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

于 2011-04-26T06:04:03.097 回答
0

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

于 2011-04-26T06:00:43.393 回答
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 );

以多态的方式表现。

于 2011-04-26T06:10:35.610 回答