c++ - 派生类的函数重载

标签 c++ oop inheritance overloading

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

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

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

  • 使类派生成为基本类并继承松散的好处
  • 将函数 calculate 更改为 calculate(double y) {return 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;

这个问题可以解决吗?

提前致谢...

最佳答案

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

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 以简化示例,您可以让 calculate 成为 friend (这将再次需要 base< 中的 derived 类的知识) 或访问器函数,如果您不想公开 x

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

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) 相同的结果。

关于c++ - 派生类的函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58023067/

相关文章:

c++ - 如何针对 windows 8.1 SDK 进行构建

c++ - 删除空格后如何将空格插入字符串

php - 在 PHP 应用程序中实现插件的设计模式

php - 将变量与实例传递给构造函数

java - 为什么我不能使用引用子类型实例的父类型的引用来调用子类方法?

c++ - 在QML中访问C++对象的成员变量

c++ - 将指针传递给函数只会改变函数作用域中的值

java - 如何为所有子类定义构造函数

Java从对象到子类的转换

java - 无法调用类中的方法