在子类中实现继承类的方法(param=指向父级的指针)(param=指向子级的指针)
Implementation of inherited class' method (param=pointer to parent) in child class (param=pointer to child)
假设我有一个带有虚拟方法的接口,但其中一个参数是:
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
的覆盖,则会导致它将对象解释为错误的类型。
(这被称为反方差-被更多特定类型覆盖的函数的参数必须与被覆盖的类型相同。出于类似的原因,返回类型必须是协变,由更特定类型覆盖的功能指定的类型必须是不小于。)
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 在子类中实现继承类的方法(param=指向父级的指针)(param=指向子级的指针)