使用派生 class 的函数重载

function overloading with derived class

我有以下例子。请注意,这只是说明问题的示例。实际情况要复杂得多。

问题是我必须从 base class 重载函数。如果计算中使用的对象是 base 类型,它使用变量 x,它对于 base 和 derived class 都是通用的。如果对象是 class derived 它使用它的特定变量 y。所以真正的问题是如何在定义class基之前定义派生class。

我知道该问题的两个解决方法,但其中 none 个是解决方案:

class base {
protected:
    double x;
public:
    double calculate(base b) {return x+b.x;}
    double calculate(derived d) {return x+d.y;}

}

class derived: base {
public:
    double y;

这个问题可以解决吗?

提前致谢...

转发声明 derived 然后定义 calculate 的主体在 derived 的定义之后不符合行应该工作:

class derived;

class base {
protected:
    double x;
public:
    double calculate(base b);
    double calculate(derived d);    
}

class derived: base {
public:
    double y;
};

inline double base::calculate(base b) {return x+b.x;}
inline double base::calculate(derived d) {return x+d.y;}

正如其他人所说,这可能是一个糟糕的设计,base 需要 derived 的知识。也许 calculate 作为一个自由函数会更好:

class base {
public:
    double x;    
}

class derived: base {
public:
    double y;
};

inline double calculate(base a, base b) {return a.x+b.x;}
inline double calculate(base a, derived b) {return a.x+b.y;}

我做了 x public 来简化示例,你可以让 calculate 成为朋友(这将再次需要 derived class 的知识 base) 或者访问器函数,如果你不想 x 是 public.

第三个更常用的选项是添加一个虚拟方法来为每个 class:

获取所需的值
class base {
protected:
    double x;
    virtual double getValue() const { return x; }
public:
    double calculate(const base& b) { return x + b.getValue(); }
}

class derived: public base {
protected:
    double getValue() override const { return y; }     
private:
    double y;
};

请注意 calculate 必须通过引用获取 class 以避免对象切片(并且更有效)。

根据您的要求,计算可能会更好地实现为:

double calculate(const base& b) { return getValue() + b.getValue(); }

这意味着 base.calculate(derived) 会 return 与 derived.calculate(base) 相同的结果。