c++继承和重载,重载后调用基方法

C++ inheritance and overloading, calling a base method once overloaded

本文关键字:重载 调用 方法 继承 c++      更新时间:2023-10-16

目前我有一个类,它包含了另一个类,并为它的一些方法提供了包装器,并提供了其他完整的方法:

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是包含两个方法calculate1calculate2的类,都取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