Do ALL虚拟函数需要在派生类中实现

Do ALL virtual functions need to be implemented in derived classes?

本文关键字:派生 实现 ALL 虚拟 函数 Do      更新时间:2023-10-16

这似乎是一个简单的问题,但我在其他地方找不到答案。

假设我有以下内容:

class Abstract {
public:
    virtual void foo() = 0;
    virtual void bar();
}
class Derived : Abstract {
public:
    virtual void foo();
}

Derived类不实现bar()函数可以吗?如果不是所有的派生类都需要bar()函数,但有些类需要呢。抽象基类的所有虚拟函数都需要在派生类中实现,还是只需要在纯虚拟的类中实现?感谢

派生类不必自己实现所有虚拟函数。他们只需要实现1这意味着问题中的Derived类是正确的。它从其祖先类Abstract继承了bar实现。(这假设Abstract::bar是在某个地方实现的。问题中的代码声明了该方法,但没有定义它。你可以像Trenki的答案所示那样内联定义它,也可以单独定义它。)


1即使这样,也只有当派生类将被实例化时。如果派生类不是直接实例化的,而是作为更多派生类的基类存在,那么那些类负责实现其所有纯虚拟方法。允许层次结构中的"中间"类保留一些未实现的纯虚拟方法,就像基类一样。如果"中间"类确实实现了一个纯虚拟方法,那么它的后代将继承该实现,因此他们不必自己重新实现它。

只有纯虚拟方法必须在派生类中实现,但您仍然需要其他虚拟方法的定义(而不仅仅是声明)。如果你不提供一个,链接器很可能会抱怨。

因此,只需将{}放在可选的虚拟方法之后,就会得到一个空的默认实现:

class Abstract {
public:
    virtual void foo() = 0; // pure virtual must be overridden
    virtual void bar() {}   // virtual with empty default implementation
};
class Derived : Abstract {
public:
    virtual void foo();
};

不过,一个更复杂的默认实现将进入一个单独的源文件。

ISO C++标准指定必须定义类的所有非纯虚拟方法。

简单地说,规则是:
如果派生类覆盖了基类虚拟方法,那么它也应该提供一个定义,如果不是,那么基类应该提供该方法的定义。

根据代码示例中的上述规则,virtual void bar();需要基类中的定义。

参考:

C++03标准:10.3虚拟函数[class.Virtual]

在类中声明的虚拟函数应被定义,或在该类中声明为纯(10.4),或两者兼有;但不需要诊断(3.2)。

因此,要么你应该让这个函数成为纯虚拟的,要么为它提供一个定义

gcc常见问题文档也记录了它:

ISO C++标准规定必须定义类的所有非纯虚拟方法,但不需要对违反此规则的[class.virtual]/8进行任何诊断。基于这一假设,GCC将只在定义其第一个此类非内联方法的转换单元中发出类的隐式定义构造函数、赋值运算符、析构函数和虚拟表。

因此,如果未能定义此特定方法,链接器可能会抱怨缺少对明显不相关的符号的定义。不幸的是,为了改进此错误消息,可能需要更改链接器,但这并不总是可以做到的。

解决方案是确保定义所有非纯的虚拟方法。请注意,即使声明为纯虚拟[class.dtor]/7,也必须定义析构函数。

是的,没关系。。。您只需要实现任何纯虚拟函数,就可以实例化从抽象基类派生的类。

是的,派生类必须覆盖父类中的纯虚拟函数是正确的。具有纯虚拟函数的父类被称为抽象类,只是因为它的子类必须给出自己的纯虚拟函数体。

对于正常虚拟功能:-没有必要进一步覆盖它们,因为有些子类可能具有该函数,有些则可能没有。

虚拟函数机制的主要目的是运行时多态性,纯虚拟函数(抽象类)的主要目的是否是强制与自己的身体具有相同的名称Function。

相关文章: