我有两个类代表某些方法的上下文。

class BaseContext {};
class DerivedContext : public BaseContext {};

我有一个基类:
class MyBase {
protected:
  virtual void doSome(BaseContext* context);
};

和派生类:
class MyDerived : public MyBase {
protected:
  virtual void doSome(DerivedContext* context) override; // Overriding
  virtual void doSome(DerivedContext* context); // Overloading?
};

由于DerivedContext是从BaseContext派生的,因此似乎我覆盖了doSome。但这也可能是一个超载...
  • 哪个是正确的?我在这里是超载还是超载?
  • 因此,如果键入(MyBase* my = new MyDerived())->doSome(new DerivedContext()),应该得到什么?
  • 最佳答案

    这既不是覆盖也不是过载。由于参数的类型不同,因此MyDerived::doSome仅隐藏MyBase::doSome

    否。这是标准中列出的优先条件。 $10.3/2 Virtual functions[class.virtual]:
    (强调我的)

    实际上,在这种情况下,使用override specifier会得到一个compile error。例如

    error: 'doSome' marked 'override' but does not override any member functions
    

    can't overload根据unqualified name lookup的规则跨作用域起作用(除非使用using-declaration将名称引入同一作用域)。

    因为您在MyBase::doSome()上调用MyBase*,所以它将被调用。这不是覆盖,因此这里没有动态调度发生。
    LIVE
    请注意,参数DerivedContext*将隐式转换为BaseContext*,然后传递给函数。 BTW (MyBase* my = new MyDerived())->...无效的语法。

    关于c++ - C++:覆盖还是重载?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39162226/

    10-15 00:55