是否有必要覆盖将基类作为参数的虚函数?

时间:2012-10-01 02:46:21

标签: c++ inheritance overloading virtual-functions

例如,我有一个带有纯虚函数的基类:

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>

2 个答案:

答案 0 :(得分:2)

是的,如果基类中有Function(const IBase&)并在派生类中覆盖它,则可以将对派生类的引用传递给Function,并调用Function(const IBase&)

答案 1 :(得分:1)

  

我需要知道的是,我是否必须在每个继承的类型中实现一个重载,该类型将继承的类型作为参数,或者编译器是否理解如果我传递Derived引用,则调用虚拟实现? / p>

如果您只覆盖基类型中定义的函数而不添加重载,编译器会将Derived的所有实例转换为IBase并调用现有函数。