多态性c ++

rl8*_*l84 7 c++ oop polymorphism

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

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

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

class A {};
class B : public A {};

class C
{
public:
    virtual void f () {}
};
Run Code Online (Sandbox Code Playgroud)

是B类还是C类多态?

Lig*_*ica 8

2003: 10.3/1 明确表示:

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

你实际上是逐字逐句地说出来的,所以我真的不明白这个问题是什么.

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


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

但是,术语"多态"在C++中的定义略有不同,它更多地与您是否可以向下转换有关.如果你不想像C++标准那样混淆,你可以称之为"动态多态".


Ben*_*igt 2

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

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


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

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