Polymorphism c++

Polymorphism c++

本文关键字:c++ Polymorphism      更新时间:2023-10-16

在一些书中,声明或继承虚函数的类称为多态类。

B类没有任何虚函数,但通过了多个is-a测试。

类C有一个虚函数,但不继承。

class A {};
class B : public A {};
class C
{
public:
    virtual void f () {}
};

B类还是C类是多态的?

2003: 10.3/1状态,明确:

声明或继承虚函数的类称为多态类。

实际上你自己一字不差地说了,所以我真的不明白你的问题是什么。

C(及其后代,如果你添加任何)是多态的;AB不存在


请注意,在更广泛的OOP意义上,您总是可以执行一些"多态性",因为c++总是允许您向上转换;因此,所有继承的对象都可以被视为不同(但相关)的类型。

然而,术语"多态"在c++中的定义略有不同,它更多地与是否可以向下转换有关。如果您不想像c++标准那样混淆,您可以将其称为"动态多态性"。

根据标准,"声明或继承虚函数的类称为多态类。"

因为AB都没有声明或继承虚函数,所以它们不是多态的。C声明一个虚函数,所以它是多态的。

class C是多态的,这意味着在C&上使用dynamic_casttypeid将执行运行时类型检查,并且通过C&C*调用成员函数将使用虚拟调度。

(当然,as-if规则允许编译器在提前知道运行时类型的情况下避免运行时分派,例如当您刚刚创建对象时。)


正如@Bill在评论中提到的,这不仅仅是一些书所说的,这是多态类的定义,可以在c++标准中找到(第10.3节,[class.virtual]):

虚函数支持动态绑定和面向对象编程。声明或继承虚函数的类称为多态类