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

时间:2017-11-02 17:16:57

标签: c++ inheritance

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

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

1 个答案:

答案 0 :(得分:5)

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

  

什么时候创建VTable?

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

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

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

E.g:

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都包含一个由X继承的指针。从我能记住和理解的那些不是指向vtable的指针,而是指向结构内部的指针(或偏移),但我无法确定。

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