C++中的多态性

7

在一些书中,有这样的写法:声明或继承虚函数的类被称为多态类。

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

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

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

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

B类或C类是多态的吗?

听起来像是作业,至少加上标签:p - KaiserJohaan
3个回答

8

2003: 10.3/1 明确规定:

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

你自己已经逐字逐句地说了这句话,所以我不太明白问题所在。

C(及其派生类,如果你添加任何)是多态的;AB则不是。


需要注意的是,在更广泛的面向对象编程(OOP)中,你总是可以进行一些"多态性",因为C++始终允许您向上转型;因此,所有继承的对象都可以被视为不同(但相关)类型。

然而,在C++中,“多态性”这个术语的定义略有不同,它更多地涉及到您是否能够进行向下转型。如果您不想像C++标准那样令人困惑,您可以将其称为“动态多态性”。


但对于一个多态类,析构函数应该是虚拟的,在这里,没有任何类有虚拟析构函数。 - A. K.
1
@Aditya:是的,应该没问题。然而,缺少虚析构函数并不会阻止类成为多态的。 - Lightness Races in Orbit
@Aditya:只有在多态删除时才会被删除。很多类从未被删除。 - Ben Voigt
析构函数不一定要为虚函数才能实现多态。如果除了析构函数之外的任何其他函数都是虚函数,那么这个类也会具有多态性。 - fatma.ekici
@fatma.ekici:但是对象不会以多态的方式被销毁。 - Lightness Races in Orbit

3
根据标准,“声明或继承虚函数的类被称为多态类。”
由于既没有A也没有B声明或继承虚函数,因此它们不是多态的。C声明了一个虚函数,因此它是多态的。

2

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

(当编译器事先知道运行时类型时,例如在刚创建对象时,as-if 规则允许编译器避免运行时调度。)


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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接