如果该类不是继承的,它会变成多态的吗

does the class becomes polymorphic if it is not inherited

本文关键字:多态 继承 如果      更新时间:2023-10-16

类变为多态的条件是什么?1.如果它是继承的,并且没有任何方法被覆盖,但只有当它们的签名中有虚拟关键字时,它是多态的吗?2.如果没有继承并且方法被声明为虚拟的,这是多态的吗?

在上述情况下,它是否创建VTable?

如果一个类至少有一个虚拟方法(自己的或继承的),那么它就是多态的。


何时创建VTable?

好的,首先让我们把elefant带出房间。该标准不需要虚拟表,并有意保留实现动态多态性的方法。在这种情况下,它只是定义了行为规则,但没有强制要求任何实现所述行为的方法。请参阅vtable的替代方案,替代虚拟机制实现?或与备选方案的比较。它们是一本有趣的读物。既然大象在实践中已经离开了房间,大多数(如果不是全部的话)C++编译器都通过vtables机制实现了多态性。

多态类将具有一个虚拟表。讨论很容易就此结束。


然而,有一个有趣的(主要是学术性的)案例需要考虑:没有多态对象的虚拟继承。

例如:

struct A {};
struct B : virtual A {};
struct C : virtual A {};
struct X : B, C { };

上面的类(*)都不是多态的。即

static_assert(!std::is_polymorphic<B>::value);
static_assert(!std::is_polymorphic<C>::value);
static_assert(!std::is_polymorphic<X>::value);

因为我们没有任何虚拟方法。

现在的问题是,我们是否有上述课程的vtable。

再次,实现虚拟继承的方法是实现定义的。

老实说,我不知道这个问题的答案。

gccclang都具有:

|           | 32 bit | 64 bit |
| --------- | ------ | ------ |
| sizeof(A) | 1      | 1      |
| sizeof(B) | 4      | 8      |
| sizeof(C) | 4      | 8      |
| sizeof(X) | 8      | 16     |

这表明B和C各自包含一个由CCD_ 3继承的指针。根据我的记忆和原因,这些不是指向vtables的指针,而是指向结构内部的指针(或偏移),但我不能确定。


(*)我再次借此机会提到,用struct关键字声明的实体是一个类。