使用派生类进行函数重载
function overloading with derived class
我有以下示例。请注意,这只是说明问题的示例。实际情况要复杂得多。
问题是我必须从基类重载函数。如果计算中使用的对象是基类型,则使用变量 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;
这个问题可以解决吗?
提前感谢...
向前声明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
以简化示例,如果您不希望x
公开,您可以使计算成为朋友(这再次需要了解base
中的derived
类(或访问器函数。
第三个更传统的选项是添加一个虚拟方法来获取每个类所需的值:
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)
相同的结果。
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载