例如,我有一个带有纯虚函数的基类:
class IBase
{
virtual void Function(const IBase& ref) = 0;
};
如果我继承了这个类,我是否必须重载'Function',它将派生类作为参数?
class Derived
{
// this will be implemented
virtual void Function(const IBase& ref) {}
// does this have to be implemented
virtual void Function(const Derived& ref) {}
};
或者编译器可以区分调用,我可以跳过编写重载函数吗?
Derived d();
...
IBase* dptr = &d; // ignoring cast for example
// would never really call 'Function' on itself, this is for example purposes
dptr->Function(d);
注意:IBase :: Function必须采用引用类型,而不是指针类型。
我理解继承纯虚函数的规则,而不是纯虚函数将基类型作为参数的特殊情况。
我需要知道的是,我是否必须在每个继承的类型中实现一个重载,该类型将继承的类型作为参数,或者编译器是否理解如果我传递Derived引用,则调用虚拟实现? / p>
答案 0 :(得分:2)
是的,如果基类中有Function(const IBase&)
并在派生类中覆盖它,则可以将对派生类的引用传递给Function
,并调用Function(const IBase&)
答案 1 :(得分:1)
我需要知道的是,我是否必须在每个继承的类型中实现一个重载,该类型将继承的类型作为参数,或者编译器是否理解如果我传递Derived引用,则调用虚拟实现? / p>
如果您只覆盖基类型中定义的函数而不添加重载,编译器会将Derived
的所有实例转换为IBase
并调用现有函数。