目前我有一个包含另一个类的类,并为其某些方法提供了一个包装器,并提供了其他方法:
class bar {
public:
int calculate1(int a, int b) {
return f.calculate1(a, b);
}
int calculate2(int a, int b) {
a ++;
b ++;
return f.calculate2(a, b);
}
private:
foo f
}
foo
是一个包含2个方法calculate1
和calculate2
的类,其中2个int
并返回int
。
有没有更好的方法来实现继承?能够摆脱这个很好:
int calculate1(int a, int b) {
return f.calculate1(a, b);
}
但是这需要调用它正在重载的函数,我不知道该怎么做:
int calculate2(int a, int b) {
a ++;
b ++;
return f.calculate2(a, b);
}
甚至是可能的还是可取的?在这种情况下是否有其他方法可供使用?
如果我的一些代码有点狡猾,我很抱歉,因为你可以告诉我对C ++有点新意,但我希望我能得到消息。答案 0 :(得分:3)
要调用基类方法,请使用限定条件:
return foo::calculate1(a, b);
如果您希望以多态方式调用它们,请务必确保您的基类方法为virtual
。
答案 1 :(得分:2)
可以通过这种方式:
class bar : public foo {
public:
int calculate2(int a, int b) {
return foo::calculate2(a+1, b+1);
}
};
答案 2 :(得分:0)
1.
有没有更好的方法来实现继承?“
当然!
//sg
#include<iostream>
class foo {
public:
int calculate1(int a, int b) {
return a * b;
}
int calculate2(int a, int b) {
a ++;
b ++;
return a + b;
}
};
class bar: public foo {
public:
int calculate1(int a, int b) {
return foo::calculate1(a, b);
}
int calculate2(int a, int b) {
a++;
b++;
return foo::calculate2(a, b);
}
};
using namespace std;
int main() {
bar b;
cout << b.calculate2(1,2) << endl;
cout << b.calculate1(1,2) << endl;
return 0;
}
继承还是撰写? (这里的继承真的更好吗?)
2. Is it even possible or advisable?
我们已经看到它是可能的。至于它是否可取,foo和bar * 的语义将决定。 他们站在,我认为继承看起来很多更好,foo包含基本的计算器,除了做额外的事情之外,bar需要使用它们。当然,这就是我认为发生的事情以及你想要的事情,可能/不正确。 ?在哪种情况下,作文可能会获胜。
作为拇指规则,您可以尝试大声说出以下两行:
a)bar 是 foo(在Car中是车辆)
b)bar 有 foo(如Car中有引擎)
如果 a 更有意义,则继承,否则撰写。如果它们都没有任何意义,那么你应该给你的设计另外一杯咖啡。
查找更多原因here
<小时/> *
将foo
视为班级widget
,将bar
视为专门的微件,例如textbox
。让calculate
成为renderer
(在屏幕上绘制文本框的函数),在bar
中对参数执行特殊操作,然后在foo
中调用标准渲染器。在这种情况下,有必要说bar
是 foo
。另一方面,让bar
成为一个约束求解器,它接受参数,进行一些计算并将它们传递给标准的la引擎foo
进行最终计算,然后我会说{{1} 1}} 有一个线性代数引擎bar
。