首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

多重继承vtable的有关问题

2012-03-16 
多重继承vtable的问题为什么这两个指针的数值不一样?如果不进行强制类型转换,是否真的可能会发生灾难性后

多重继承vtable的问题
为什么这两个指针的数值不一样?
如果不进行强制类型转换,是否真的可能会发生灾难性后果?
反正我是没遇见过,因为没有强制类型转换而发生灾难性后果。

C/C++ code
//#include <iostream>using namespace std;class A{public:    virtual void ShowA()    {        cout << "A" << endl;    }};class B{public:    virtual void ShowB()    {        cout << "B" << endl;    }};class C:public A,public B{public:    void ShowA()    {        cout << "CA" << endl;    }    void ShowB()    {        cout << "CB" << endl;    }    void ShowC()    {        cout << "C" << endl;    }};int main(){    C* c = new C;    A* a = (A*)c;    B* b = (B*)c;    a->ShowA();    b->ShowB();    cout << a << endl;    cout << b << endl;    return 0;}


[解决办法]
去看《深度探索C++对象模型》
[解决办法]
这样的强转会有问题的,如果你想用多态,那直接用基类的指针指向子类的对象就行了,别这样玩啊...

你可以去找一下,C++中的四中强制类型转换的详细说明以及例子,那里面会告诉你应该怎么转换。但是这样的代码,即使在某个编译器上转换

成功了,移植性也很差...
[解决办法]
a和b确实是引用了不同的vtable。但是不必用强制类型转换,至少从98年有正式的C++标准开始就是这样的。因为即使不使用强制类型转换,编译器也会默默地完成这个转换。编译器默默完成的这个转换和强制类型转换的效果是完全一样的。

所以“必须使用强制类型转换来使 a 和 b 引用不同的vtable,”这句话确实是不对的,答案是“不必须”。

热点排行