Do ALL虚拟函数需要在派生类中实现
Do ALL virtual functions need to be implemented in derived classes?
这似乎是一个简单的问题,但我在其他地方找不到答案。
假设我有以下内容:
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。
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 如何在从抽象基派生的类中实现相同的方法?
- 对派生自同一基类的类实现冲突检查
- 使用模板实现派生类
- 如何为具有私有成员的派生类实现移动构造函数
- 关于C++从派生类调用在基类中实现的虚拟函数的问题
- 如何在基类中定义静态接口,并确保该接口必须在派生类中实现
- 如何在派生类上强制实现特定数据类型的构造函数?
- C++派生类中的纯虚函数实现
- C :在f的派生类实现中,可以用x的子类型代替纯虚拟函数f的参数x
- 确保派生的类实现至少是来自抽象类(C )的两种方法之一
- C 结构实现派生接口
- 两个子级具有相同的 F() 实现,另外两个子级具有不同的 F 实现,所有四个子级都派生自同一类
- 如何在C++中正确表达具有相同实现的两个派生类函数?
- 如果不在派生类实现中执行此操作,"basic_streambuf"是否会创建自己的获取/放置区域?
- 如果未实现虚函数,则大多数派生类无法编译,但如果一个基类未实现虚函数,则可以编译
- 从基类(车辆)继承方法,从派生类(汽车)继承值,以使用 C++ 在另一个派生类(车道)中实现
- 没有实现文件(.cpp)的派生类
- C++通过映射并使用中的方法从基类实现派生类