我有两个类代表某些方法的上下文。
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/