c – 虚拟表的顺序是否重要?

前端之家收集整理的这篇文章主要介绍了c – 虚拟表的顺序是否重要?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是新的,让我轻松:)
从我讲师在一段时间以前所说的,虚拟表的顺序很重要.
但我不明白的原因!

给定下一个代码

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

猜你在找的C&C++相关文章