2013-07-09 52 views
0

我有一个基类容器类,它有一些运算符(=,+, - ,+ =等)。预计操作符的逻辑不需要为派生类改变。因此,理想情况下,我想为所有派生类使用基类运算符,而不必为每个派生类显式重新定义它们(除赋值运算符外)。派生类的操作符重载

基于一个简单的例子,下面演示了我提出的解决方案。该解决方案似乎有效,但我对该方法对于更复杂案例的有效性抱有怀疑。你认为在B班使用这个作业“黑客”是否有效?这种方法的潜在缺陷是什么?有什么我错过了吗?是否有更简单的方法来实现我需要的功能(即对派生类使用基类运算符)?

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

在这段代码中,B没有任何可见的用途,仅仅是一个没有添加内容的A的薄包装。这就是为什么'myB = myB + myB'的原因。如果你的真实代码是这样的,那么就去除B。如果真实的B比A更容易达到,那么你应该怎么处理它。 –

+0

@ n.m。你是对的。我现在意识到这个例子并不代表真正的问题。我将不得不重新提交问题。感谢您的评论。 – user1391279

+0

@ user1391279您好,我只是想提一提,[最近删除的问题(http://webcache.googleusercontent.com/search?q=cache:AmeqkRXnNHYJ:stackoverflow.com/questions/26790845/passing-ublas-subrange-一个函数+&cd = 1&hl = en&ct = clnk&gl = br&client = firefox-a)导致了这个非常有趣的讨论:http://stackoverflow.com/q/26793072/1000282。我会回答,但是,正如你所看到的,现在它已经被删除了。对不起,但我想不出有什么其他联系方式,我希望在阅读之前,这个评论不会被适度删除。 –

回答

0

对于给定的我没有看到可能发生的任何问题的例子。因为你可以改进代码,首先通过在operator =中返回非const引用,其次我认为通过将+ = op加入你的类,并在全局运算符+函数中使用它的代码。

但总的来说,我认为它应该可以正常工作。至于赋值操作符 - 只要你只有POD类型,没有指针,或引用或句柄,你就不需要任何操作。 然而,当指针出现时,它会变得更加复杂。你需要确保你复制对象,指向他们,或者以其他方式管理它们。

而且你可能不需要,只要你不添加更多成员派生类,这也应该参与计算,以修改您的运营商。

0

一般来说,你不必重新定义基类函数派生类。通过公共继承,派生类将可以访问这些函数并使用它们的操作。如果你想重新定义它们(例如=运算符),确保你调用了正确的(在这种情况下,虚拟函数有帮助)。