【发布时间】:2014-08-02 11:30:06
【问题描述】:
我有这个类层次结构,我试图在其中添加 operator= :
class A
{
public:
virtual void someFunction() = 0;
virtual A& operator=(const A&) = 0;
};
class B : public A
{
public:
void someFunction() {
//implementation
}
A& operator=(const A& o)
{
*ptr = *o.ptr;
return *this;
}
private:
A* ptr;
};
class C : public A
{
public:
void someFunction() {
//implementation
}
A& operator=(const A& o)
{
data = o.data;
return *this;
}
private:
int data; //NOTE: different members that needs to be copied in the operator
};
我明白为什么这不起作用。我在 B 中有一个私有成员(需要在那里)和一个需要覆盖的函数A&operator=(const A&)。问题是 o 属于 A 类型,并且没有指针 ptr。
我尝试将 dynamic_cast o 转换为类型 B,但是
- 这行不通,因为它是恒定的,
- 看起来不安全(如果 rhs 是 C 类)
C 类也有同样的问题。 是否有一些更有效的解决方法?
澄清为什么我需要这种方式:
class superClass
{
public:
superClass& operator=(const superClass& o)
{
*some_A_type = *o.some_A_type;
}
private:
A* some_A_type;
};
本质上,我想要的是 superClass 的 operator=。我不确定在哪里或如何解决它。
【问题讨论】:
-
为什么
A中的赋值运算符放在首位?我首先要捍卫那个决定。 -
因为后来的使用方式。我有一个 X 类,它必须能够存储任何类型的 A-child 并对它们执行操作。
-
假设有一段时间是有道理的,当你
B b; C c; b = c;时,你期望会发生什么?存储对A派生的引用不需要赋值运算符。它需要对真实对象的引用和/或指针,否则你最终会盯着a slicing problem的喉咙@ -
然后你为每个类实现正确的赋值,把它放在 A 之外,并为你的多态性使用指针(最好是智能指针)或引用。
-
也许你会找到答案here。尤其是 Brian R. Bondy 的回答看起来很有希望。
标签: c++ inheritance c++11 operator-overloading abstract