【问题标题】:Is it neccessary to override a virtual function that takes the base class as a parameter?是否需要重写以基类为参数的虚函数?
【发布时间】:2012-09-21 22:19:56
【问题描述】:

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

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

【问题讨论】:

  • Derived d(); 不创建类对象。但它声明了一个名为 d 的函数,它不带参数并返回 Derived 类型的对象。它是 之一C++ 中最令人头疼的解析
  • 这只是对默认构造函数的示例调用,因此它在函数的范围内。我明白你的意思,虽然这只是为了证明 Derived 实例的存在。
  • 你可以简单地说Derived d;
  • 这使得d 未初始化,Derived 的默认构造函数可以实例化成员。我建议永远不要让变量未初始化。
  • 假设两个函数做同样的事情(并且两种类型都应该是相同的),只有带有const IBase &参数的那个应该是虚拟的。该函数应该在正确的类型检查后调用另一个函数。也可以使用 CRTP。

标签: c++ inheritance overloading virtual-functions


【解决方案1】:

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

【讨论】:

  • Nitpick: 没有跨继承层次结构的函数加载,你得到的是函数隐藏而不是函数重载
  • 我修改了帖子以更好地反映我的意图。
  • 如果我理解正确的话,是的,你必须在每个派生类中写一个Function(const Base&),但你不需要写一个Function(const Derived&)Base 重载将被调用如果你通过Derived
  • @Seth 正是我的意思:) 谢谢!您应该修改您的答案,以便我可以选择它:D
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-08-10
    • 2012-02-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多