我是新的,让我轻松:)
从我讲师在一段时间以前所说的,虚拟表的顺序很重要.
但我不明白的原因!
从我讲师在一段时间以前所说的,虚拟表的顺序很重要.
但我不明白的原因!
给定下一个代码:
class A { public: A() {cout <<"1" << endl;}; A (const A& s) {cout << "2" << endl;} ~A () {cout << "3" << endl;} void f1() {cout << "4" << endl; f2();} virtual void f2() = 0; virtual void f3() {cout << "5" << endl;} }; class B : public A { public: B() {cout << "6" << endl;} B(const B& b) : A(b) {cout << "7" << endl;} ~B() {cout << "8" << endl;} virtual void f1() {cout<<"9"<<endl;} void f2() {cout<<"lO"<<endl; f4();} virtual void f2(int i) {cout << "11" << endl;} virtual void f4() {cout << "12" << endl; f3();} };
他说这个命令是:
A's vtable : A::f2() A::f3() B's vtable : B::f2() A::f3() B::f1() B::f2(int) B::f4()
但我不明白为什么这很重要?他说,如果是这样的话,这个vtable是没用的
不是按照正确的顺序,你能解释一下为什么吗?
解决方法
@H_502_18@ vtable的顺序对于正常工作来说很重要,但只对编译器(即不需要关心,因为它需要处理).如果编译器为自己设置不合格,那么事情会中断,因为函数被偏移量调用(所以偏移量会产生一个随机函数,这将是灾难性的).但平均程序员不需要担心关于vtable的什么顺序.