如果没有继承,那么这个类会变成多态的吗?

deb*_*air -2 c++ inheritance

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

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

bol*_*lov 5

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


什么时候创建VTable?

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

多态类将具有虚拟表.讨论很容易在这里结束.


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

例如:

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

struct X : B, C { };
Run Code Online (Sandbox Code Playgroud)

上述类(*)都不是多态的.即

static_assert(!std::is_polymorphic<B>::value);
static_assert(!std::is_polymorphic<C>::value);
static_assert(!std::is_polymorphic<X>::value);
Run Code Online (Sandbox Code Playgroud)

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

现在的问题是,如果我们有上述课程的vtable.

实现虚拟继承的方法也是实现定义的.

老实说,我不知道答案.

双方gccclang具有:

|           | 32 bit | 64 bit |
| --------- | ------ | ------ |
| sizeof(A) | 1      | 1      |
| sizeof(B) | 4      | 8      |
| sizeof(C) | 4      | 8      |
| sizeof(X) | 8      | 16     |
Run Code Online (Sandbox Code Playgroud)

这表明B和C都包含一个继承的指针X.从我能记住和理由的那些不是指向vtable的指针,而是指向结构内部的指针(或偏移),但我无法确定.


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