在一些书中,有这样的写法:声明或继承虚函数的类被称为多态类。
类B没有任何虚函数,但通过超过一个is-a测试。
类C有一个虚函数,但不继承。
class A {};
class B : public A {};
class C
{
public:
virtual void f () {}
};
B类或C类是多态的吗?
在一些书中,有这样的写法:声明或继承虚函数的类被称为多态类。
类B没有任何虚函数,但通过超过一个is-a测试。
类C有一个虚函数,但不继承。
class A {};
class B : public A {};
class C
{
public:
virtual void f () {}
};
2003: 10.3/1
明确规定:
声明或继承虚函数的类被称为多态类。
你自己已经逐字逐句地说了这句话,所以我不太明白问题所在。
C
(及其派生类,如果你添加任何)是多态的;A
和B
则不是。
需要注意的是,在更广泛的面向对象编程(OOP)中,你总是可以进行一些"多态性",因为C++始终允许您向上转型;因此,所有继承的对象都可以被视为不同(但相关)类型。
然而,在C++中,“多态性”这个术语的定义略有不同,它更多地涉及到您是否能够进行向下转型。如果您不想像C++标准那样令人困惑,您可以将其称为“动态多态性”。
class C
是多态的,这意味着对于 C&
使用 dynamic_cast
或 typeid
将进行运行时类型检查,并且通过 C&
或 C*
调用成员函数将使用虚函数调度。
(当编译器事先知道运行时类型时,例如在刚创建对象时,as-if 规则允许编译器避免运行时调度。)
正如 @Bill 在评论中提到的,这不仅是一些书籍所说的,也是在 C++ 标准中定义的 多态类 的定义(第 10.3 节,[class.virtual]
):
虚函数支持动态绑定和面向对象编程。声明或继承虚函数的类被称为 多态类。