如果该类不是继承的,它会变成多态的吗
does the class becomes polymorphic if it is not inherited
类变为多态的条件是什么?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。
再次,实现虚拟继承的方法是实现定义的。
老实说,我不知道这个问题的答案。
gcc
和clang
都具有:
| | 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
关键字声明的实体是一个类。
相关文章:
- 继承/多态性 - 我是否被迫使用"protected"变量?
- 当依赖关系和依赖关系都是多态时,在哪个继承级别存储依赖关系指针?
- 具有 3 级继承的基类shared_ptr的多态性
- C 中的多态性.在基类上调用继承的方法
- 模板、继承和多态性 C++
- 了解C++中的继承和多态性
- 继承多态性功能调用
- C++接口、继承、多态性
- Sean Parent:对于继承层次结构中的多态类型,具有可变对象是极端的例外
- 如何在保持多态性的同时,将成员函数添加到需要它的继承类中,而不会影响其他同级类?
- 在C++中使用多态性相对于继承的实际优势
- 如果该类不是继承的,它会变成多态的吗
- 收到未定义的引用错误 c++ 继承/多态性
- C++ 继承、多态、运算符重载
- 多态性(继承)和价值类型
- 多种继承和多态性问题
- 如何正确组织继承类以利用多态性
- bisonc++的多态继承
- 如何对多态继承层次结构执行灵活的序列化
- 这是非多态继承的好理由吗?