多重继承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,”这句话确实是不对的,答案是“不必须”。