作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 virtual inheritance
很感兴趣这件事给我带来了神秘感。让我们以 virtual inheritance
为例。 :
struct Base {
virtual void v() { std::cout << "v"; }
};
struct IntermediateDerivedFirst : virtual Base {
virtual void w() { std::cout << "w"; }
};
struct IntermediateDerivedSecond : virtual Base {
virtual void x() { std::cout << "x"; }
};
struct Derived : IntermediateDerivedFirst, IntermediateDerivedSecond {
virtual void y() { std::cout << "y"; }
};
最后,
Derived
应该是这样的:
--------
|[vtable]| -----> [ vbase offset 20 ]
|[vtable]|--- [ top offset 0 ]
|[vtable]|- | [ Derived typeinfo ]
-------- || [ IntermediateDerivedFirst::w() ]
|| [ Derived::y() ]
||
|----> [ vbase offset 12 ]
| [ top offset -8 ]
| [ Derived typeinfo ]
| [ IntermediateDerivedSecond::x()]
|
-----> [ vbase offset 0 ]
[ top offset -20 ]
[ Derived typeinfo ]
[ Base::v() ]
所以,从字面上看,
virtual
继承 Action
vtable
对于最基础的类,我们可以看到——
vtable
代表
IntermediateDerivedFirst
,
IntermediateDerivedSecond
不包含
Base
的地址的
v()
方法。好的,那么,我们可以看到该类有几个
vtable
s。
IntermediateDerivedFirst* fb = new Derived;
fb->v();
delete fb;
此调用仍然有效,
然而 ,
vtable
对于
IntermediateDerivedFirst
没有关于
v()
的信息方法,它似乎在这里使用了一些魔法,它使用了第三个
vtable
调用指针
v()
.
vtable
获取被调用函数地址的指针?
最佳答案
Bjarne Stroustroup 写了一篇关于使用 C++ 解决多重继承中的“菱形继承(钻石问题)”的详细论文:
Stroustrup, B Fall 1989, 'Multiple Inheritance for C++'. Computing Systems, Vol. 2 No. 4, p. 367-395
在两个 IntermediateDerived 类中声明了“虚拟基础”;保证您只获得公共(public)基类的单个实例。
来自 C++ Language / Classes / Derived classes
For each distinct base class that is specified virtual, the most derived object contains only one base class subobject of that type, even if the class appears many times in the inheritance hierarchy (as long as it is inherited virtual every time).
关于c++ - 如何在类中的其他 vtable 指针中选择 vtable 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67248308/
我是一名优秀的程序员,十分优秀!