首页 > 解决方案 > 派生类的函数重载

问题描述

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

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

我知道该问题的两种解决方法,但它们都不是解决方案:

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;

这个问题可以解决吗?

提前致谢...

标签: c++oopinheritanceoverloading

解决方案


前向声明,然后在定义应该工作之后定义 out of linederived的主体:calculatederived

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,您可以让计算朋友(这再次需要了解 中的derived类)或访问器函数。basex

第三个更惯用的选项是添加一个虚拟方法来获取每个类所需的值:

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必须通过引用来获取类以避免对象切片(及其更有效)。

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

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

这意味着base.calculate(derived)它将返回与 相同的结果derived.calculate(base)


推荐阅读