所有的虚函数都需要在派生类中实现吗?

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

假设我有以下内容:

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


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

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

90249 次浏览

派生类 没有必须自己实现 所有虚函数。他们只需要实现 纯洁的。这意味着问题中的 Derived类是正确的。它的 继承遗产来自其祖先类 Abstractbar实现。(这里假设在某个地方实现了 Abstract::bar。问题中的代码声明了方法,但没有定义它。您可以像 特伦基的回答显示的那样内联地定义它,也可以单独地定义它。)


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

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

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

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

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 + + 标准规定必须定义类的所有非纯虚方法。

简而言之,规则是:
如果派生类重写 Base 类虚方法,那么它也应该提供一个定义,如果不是,那么 Base 类应该提供该方法的定义。

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

Reference:

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

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

因此,要么让函数纯粹是虚函数,要么为它提供一个定义。

Gcc faq < a href = “ http://gcc.gnu.org/faq.html # vtables”rel = “ noReferrer”> gcc faq 也对此进行了记录:

The ISO C++ Standard specifies that all virtual methods of a class that are not pure-virtual must be defined, but does not require any diagnostic for violations of this rule [class.virtual]/8. Based on this assumption, GCC will only emit the implicitly defined constructors, the assignment operator, the destructor and the virtual table of a class in the translation unit that defines its first such non-inline method.

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

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

是的,派生类必须在父类中覆盖纯虚函数,这是正确的。具有纯虚函数的父类之所以称为抽象类,仅仅是因为它的子类必须给出自己的纯虚函数体。

常规虚拟函数:- Its not necessary to override them further, as some child class may have that function, some may not have.

Main purpose of Virtual Function mechanism is Run Time Polymorphism, whether main purpose of Pure Virtual Function(Abstract Class) is to make it mandatory to have the same name Function with own's body.