当类变成多态时,有什么条件?1.它是多态的,如果它是继承的,并且没有任何方法被覆盖,但只有它们在签名中有虚拟关键字?2.如果没有继承并且方法被声明为虚拟,它是多态的吗?
在上述情况下是否会创建VTable?
如果一个类至少有一个虚拟方法(自己的或继承的),则它是多态的.
什么时候创建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.
实现虚拟继承的方法也是实现定义的.
老实说,我不知道答案.
双方gcc并clang具有:
| | 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关键字声明的实体是一个类.
| 归档时间: |
|
| 查看次数: |
59 次 |
| 最近记录: |