c – 虚拟表的顺序是否重要?
发布时间:2020-12-16 03:13:32 所属栏目:百科 来源:网络整理
导读:我是新的,让我轻松:) 从我讲师在一段时间以前所说的,虚拟表的顺序很重要. 但我不明白的原因! 给定下一个代码: 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 v
我是新的,让我轻松:)
从我讲师在一段时间以前所说的,虚拟表的顺序很重要. 但我不明白的原因! 给定下一个代码: 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是没用的 解决方法
vtable的顺序对于正常工作来说很重要,但只对编译器(即不需要关心,因为它需要处理).
如果编译器为自己设置不合格,那么事情会中断,因为函数被偏移量调用(所以偏移量会产生一个随机函数,这将是灾难性的).但平均程序员不需要担心关于vtable的什么顺序. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容