假设我有一个虚拟方法的接口,但其中一个参数是:
virtual void Delete(ParentClass *parentClass) = 0;
如果我稍后在子类中实现它
void Delete(ChildClass *childClass)
{
};
...为什么这不作为实施工作?
答案 0 :(得分:1)
由于函数原型不同(一个使用ParentClass
而另一个ChildClass
),它们不相同的函数。相反,具有ChildClass
参数的那个是重载而不是覆盖Delete
函数。
答案 1 :(得分:0)
C ++ 03标准:10.3 / 2
如果在类
vf
和类Base
中声明虚拟成员函数Derived
,直接或间接地从Base
派生,则成员函数{{1声明与vf
相同的名称和相同参数列表的 ,然后Base::vf
也是虚拟的,它会覆盖Derived::vf
。
请注意粗体文字
派生类函数仅覆盖基类函数,并且仅当它具有与基类函数相同的签名时, Co-Variant return types 除外。由于您的函数Base::vf
在Base Class和Derived类中没有相同的签名,因此派生类函数不会覆盖Base类函数,但您获得的仅仅是 Function Hiding < / EM> 强>
C ++ 03标准:3.3.7 / 1:
可以通过嵌套声明性区域或派生类中相同名称的显式声明来隐藏名称。
答案 2 :(得分:0)
因为任何被接受为基类函数的参数的类型,也必须通过覆盖该函数来接受。这可以防止出现如下错误:
struct BastardClass : ParentClass {} wrong;
Delete(&wrong);
,如果调度到期望ChildClass
的覆盖,将导致它将对象解释为错误的类型。
(这称为 contravariance - 由 more 特定类型覆盖的函数的参数必须不再特定于被覆盖的那些 。出于类似的原因,返回类型必须是协变 - 由 more 特定类型覆盖的函数指定的那些必须不低于特定。)