在C ++中向上转换堆栈上的对象与堆之间的区别是什么?

时间:2018-05-09 15:32:50

标签: c++ oop

当我运行下面的代码时(在VS2013中),结果(也作为评论发布)让我困惑:

class Base {
public:
    virtual void foo(){ cout << "in base" << endl; }
    virtual void foo(int){ cout << "in base int" << endl; }
};

class Derived : public Base {
public:
    virtual void foo(){ cout << "in derived" << endl; }
};

int main() {
    Derived *d = new Derived();
    Derived d1;
    ((Base*)d)->foo();  //in derived
    ((Base*)d)->foo(1); //in base int
    ((Base)d1).foo();    //in base
    ((Base)d1).foo(1);   //in base int
    system("pause");
    return 0;
}

对于((Base*)d)->foo(); //in derived我认为我理解:d->__vptr指向Devierd类的vftable。在向上转换之后,地址d->__vptr指向的地址不会更改,尽管它现在已解析为Base对象而非Derived对象。这个vftable地址中的条目总是Derived :: foo()。所以输出是&#34;在派生&#34;中。如果我理解了,请纠正我。

我认为这也适用于((Base*)d)->foo(1),除了vftable中的条目被解析为Base :: foo(int)。但我在这里有一个问题:Derived :: foo()通过名称隐藏隐藏Base :: foo(int),那么为什么foo(int)在向上转换后可以再次访问? base vftable中有两个条目,但是在名称隐藏后派生的vtable中有多少条目?

((Base)d1).foo()((Base)d1).foo(1)我不知道会发生什么。

任何人都可以帮助我吗?感谢。

0 个答案:

没有答案