我有一个基本容器类,它有许多运算符(=,+, - ,+ =等)。预计不需要为派生类更改运算符的逻辑。因此,理想情况下,我想为所有派生类使用基类运算符,而不必显式地为每个派生类重新定义它们(除了赋值运算符)。
下面基于一个简单的例子演示了我提出的解决方案。解决方案似乎有效,但我对这种方法在更复杂情况下的有效性表示怀疑。你觉得在B级使用这个任务“hack”是否有效?这种方法有哪些潜在的缺陷?我错过了什么吗?是否有更简单的方法来实现我需要的功能(即使用派生类的基类运算符)?
class A
{
protected:
int a;
public:
A(int ca)
{
a=ca;
}
A(const A& A1)
{
a=A1.a;
}
int geta() const
{
return a;
}
void seta(int ca)
{
a=ca;
}
const A& operator=(const A& A1)
{
a=A1.a;
return *this;
}
};
const A operator+(const A& A1, const A& A2)
{
A myA(A1.geta()+A2.geta());
return myA;
}
class B: public A
{
public:
B(int a): A(a) {}// ... using A::A;
const B& operator=(const B& B1)
{
a=B1.geta();
return *this;
}
const B& operator=(const A& B1)
{
a=B1.geta();
return *this;
}
};
int main()
{
B myB(4);
A myA(3);
//need this to work
myB=myB+myB;
cout << myB.geta();
myA=myA+myA;
cout << myA.geta();
int j;
cin >> j;
}
答案 0 :(得分:0)
对于给出的示例,我没有看到任何可能发生的问题。因为你可以改进代码,首先在operator =中返回非const引用,其次我想通过在你的类中添加+ = op,并在全局operator + function中使用它的代码。
但总的来说,我认为应该可以正常工作。对于赋值运算符 - 只要你只有POD类型而没有指针,或引用或句柄,你就不需要任何。 当指针出现时,它会变得更复杂。您需要确保复制由它们指向的对象,或以其他方式管理它们。
只要你不向派生类添加更多成员,你也可能不需要修改你的运算符,派生类也应该参与计算。
答案 1 :(得分:0)
通常,您不必在基类中重新定义派生类的函数。使用公共继承,派生类将可以访问这些函数并使用它们的操作。如果你想重新定义它们(例如=运算符),请确保调用正确的(在这种情况下,虚函数有帮助)。