在子类中实现继承类的方法(param=指向父级的指针)(param=指向子级的指针)

Implementation of inherited class' method (param=pointer to parent) in child class (param=pointer to child)

本文关键字:指针 param 子类 实现 方法 继承      更新时间:2023-10-16

假设我有一个带有虚拟方法的接口,但其中一个参数是:

virtual void Delete(ParentClass *parentClass) = 0;

如果我以后在子类中实现这一点

void Delete(ChildClass *childClass)
{
};

为什么这不能作为一种实现?

由于函数原型不同(一个使用ParentClass,另一个使用ChildClass),它们是而不是相同的函数。相反,带有ChildClass参数的是重载而不是重写Delete函数。

C++03标准:10.3/2

如果虚拟成员函数vf在类Base中声明,并且在直接或间接从Base派生的类Derived中声明,则声明与Base::vf具有相同名称和参数列表的成员函数vf,则Derived::vf也是虚拟的,并且它覆盖Base::vf

请注意粗体文本
派生类函数仅在基类函数与基类函数具有相同签名的情况下覆盖基类函数,Co-Variant返回类型除外。由于函数Delete()在基类和派生类中没有相同的签名,派生类函数并没有覆盖基类函数,而得到的只是函数隐藏

C++03标准:3.3.7/1:

可以通过嵌套声明性区域或派生类中相同名称的显式声明来隐藏名称。

因为任何被接受为基类函数参数的类型,也必须被该函数的重写所接受。这样可以防止出现以下错误:

struct BastardClass : ParentClass {} wrong;
Delete(&wrong);

如果将其分派给期望ChildClass的覆盖,则会导致它将对象解释为错误的类型。

(这被称为反方差-被更多特定类型覆盖的函数的参数必须与被覆盖的类型相同。出于类似的原因,返回类型必须是协变,由特定类型覆盖的功能指定的类型必须是不小于。)