加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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的什么顺序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读