你有:
struct Base {
virtual double Function() const;
};
struct Derived1 : Base {
virtual double Function() const;
};
struct Derived2 : Base {
virtual double Function() const;
};
你要:
struct Derived1 : Base {
virtual double Function(); // overrides virtual function in base
};
所以,首先你需要添加一个非常量虚函数到Base
,否则你不会覆盖任何东西。问题是,基类函数应该定义为什么?为了最小化中断,它应该做与当前通过非常量引用调用函数相同的事情——调用 const 函数:
struct Base {
virtual double Function() const;
virtual double Function() { return static_cast<const Base*>(this)->Function(); }
};
struct Derived1 : Base {
virtual double Function() const;
virtual double Function();
};
struct Derived2 : Base {
virtual double Function() const;
// no need to override non-const Function
};
我认为这仍然可能会破坏现有代码,例如,如果您将指针指向函数的 const 和非 const 版本,那么以前它们会比较相等,而现在它们不会:
typedef double (Base::*constfunc)() const;
typedef double (Base::*mutfunc)();
((mutfunc)(constfunc(&Base::Function)) == (mutfunc(&Base::Function))); // was true, now false
对于该类的典型用户Base
,添加新功能可能是无害的。
double
但是,您说:“使用上述虚函数但具有非 const 返回值”,并且您的示例函数即使使用 const 版本的函数也已经具有非 const 返回值 ( )。所以答案无法解决这个问题,而且通过隐藏你的真实用例,你得到的答案可能比你通过一个更好地反映你的实际代码的例子得到的答案更糟糕。