我有两个类 - 基类A和派生类B - 我写这个
A obj;
B obj2;
obj = obj2;
如果我还没有覆盖任何分配操作员,会发生什么?这只是将obj2的A部分复制到obj中吗?这甚至是正确的,还是编译器只是借口的错误? IS_A关系是否允许执行此语句?任何帮助是极大的赞赏。
答案 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 );
以多态方式行事。