c++ - 派生类的函数重载
问题描述
我有以下示例。请注意,这只是说明问题的示例。实际情况要复杂得多。
问题是我必须从基类重载函数。如果计算中使用的对象是基类,则它使用变量 x,这对于基类和派生类都是通用的。如果对象是类派生的,则它使用其特定的变量 y。所以真正的问题是如何在定义类基之前定义派生类。
我知道该问题的两种解决方法,但它们都不是解决方案:
- 使类派生基本类和继承的松散好处
- 更改函数计算为
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;
这个问题可以解决吗?
提前致谢...
解决方案
前向声明,然后在定义应该工作之后定义 out of linederived
的主体: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
,您可以让计算朋友(这再次需要了解 中的derived
类)或访问器函数。base
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)
。
推荐阅读
- sql-server-2012 - 有没有办法为 NOT EXISTS 子句提供例外?
- javascript - 反应状态组件 - 无法读取未定义的属性“状态”
- cocos2d-js - 为什么浏览器不调用 Cocos Creator 引擎文件?
- reactjs - Nextjs + expressjs + Azure Web App:使用 express 的两因素身份验证('fs' 不能在客户端使用)
- javascript - 如何在我的 laravel 代码中看到 JavaScript var 到函数中?
- vue.js - vuejs datepicker selected 事件无法正常工作
- authentication - 我可以在 AWS Cognito 中手动设置客户端 ID 吗?
- css - 使用 CSS Grid 实现不平衡的 Masonry Grid
- javascript - 将字母表中的每个字母附加在一起的循环
- python - 将变量从 Python (win32) 传递到 Excel VBA 宏