c++继承和重载,重载后调用基方法
C++ inheritance and overloading, calling a base method once overloaded
目前我有一个类,它包含了另一个类,并为它的一些方法提供了包装器,并提供了其他完整的方法:
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
是包含两个方法calculate1
和calculate2
的类,都取2个int
s,返回一个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++有点陌生,但我希望我能把信息传达给你。
要调用基类方法,请使用qualification:
return foo::calculate1(a, b);
请记住,如果您希望以多态方式调用它们,请确保您的基类方法是virtual
。
可以这样做:
class bar : public foo {
public:
int calculate2(int a, int b) {
return foo::calculate2(a+1, b+1);
}
};
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 is a Vehicle)
b) bar 有一个 foo(如Car有一个Engine)
如果a更有意义,继承,否则组成。如果它们都没有任何意义,那么你可能应该给你的设计再来一杯咖啡。
点击此处查找更多原因
*
把foo
看作一个类widget
,把bar
看作一个专门的小部件,比如textbox
。让calculate
成为renderer
(一个在屏幕上绘制文本框的函数),你在bar
中对参数做一些特殊的事情,然后在foo
中调用标准渲染器。在这种情况下,说bar
是一个 foo
是有意义的。另一方面,假设bar
是一个约束求解器,它接受参数,进行一些计算,并将它们传递给标准的la引擎foo
进行最终计算,那么我会说bar
有一个线性代数引擎foo
。
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 重载方法的方式会在使用临时调用时生成编译器错误
- 重载类方法的不明确调用
- C++ 如何重载 [] 运算符并进行函数调用
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 调用重载的"<大括号括起来的初始值设定项列表>"对于对来说就足够了是模棱两可的
- 为什么初始化时没有调用重载赋值运算符?
- 如何调用用于重载运算符"<<"的 friend 函数?
- 模板化类如何解析在其类型之一上调用的重载非成员函数?
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- C++:对函子重载调用运算符的未定义引用
- 重载调用是不明确的:一对内联映射作为构造函数参数
- C++模板重载调用
- 使用子类型重载调用函数
- 从新重载调用构造函数和直接调用构造函数有什么区别?
- 使用已删除的副本构造函数和初始值设定项列表重载调用类定义中的成员构造函数
- 如何重载调用自身重载版本的函数
- 重载调用是二义性的
- C++运算符重载:调用默认函数