1

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

class IBase
{
    virtual void Function(const IBase& ref) = 0;
};

如果我继承该类,是否必须重载以派生类为参数的“函数”?

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 引用来调用虚拟实现?

4

2 回答 2

2

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

于 2012-10-01T02:49:13.853 回答
2

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

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

于 2012-10-01T03:18:00.880 回答