首页
社区
课程
招聘
[求助]虚拟继承时如何从基类到派生类进行指针转换?
发表于: 2008-7-12 13:47 5257

[求助]虚拟继承时如何从基类到派生类进行指针转换?

2008-7-12 13:47
5257
class A0         
{
        int i;       
};

class A3 : virtual public A0
{

};

void fn1(A0 a0)
{
        printf( "next.\n" );
}

int main(int argc, char* argv[])
{
        A0 a0;
        A3 a3;
       
        A0* pa0;
        A3* pa3;

        a0=a3;      //这肯定没问题
        //a3=a0;      这肯定行不通
        pa0=&a3;  //这也肯定没问题
        pa3=(A3*)(void*)&a0;  //可以骗过VC6的编译器 但执行出错 如果不加(void*)则通不过编译
        printf("%p\n",&a0);      //2个首地址是一样的
        printf("%p\n",pa3);
        fn1(*pa3);                    //编译可以 但是执行到这里报错 弹出对话框

        return 0;
}

请教一下各位达人:
[1]为什么不用虚拟继承时,pa3=(A3*)&a0;编译和运行都没有问题呢?但只要一上虚拟继承就不可以了,即使加上(void*)也不行?(VC++6.0)
[2]在虚拟继承下,如何让派生类的指针指向基类对象的地址?即把&a0赋值给pa3?


       

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
难道问题太小白,都没人理?= =
2008-7-12 18:04
0
雪    币: 466
活跃值: (165)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
3
[1]为什么不用虚拟继承时,pa3=(A3*)&a0;编译和运行都没有问题呢?
为什么会有问题呢?(A3*)是强制类型转换,是c中使用的,等价于c++里的reinterpret_cast。这种转换产生了“编译器腐败”,即编译器不再检查转换是否正确。
[2]但只要一上虚拟继承就不可以了,即使加上(void*)也不行?(VC++6.0)
我这里加上(void*)是可以正常编译的。
[3]在虚拟继承下,如何让派生类的指针指向基类对象的地址?即把&a0赋值给pa3?
使用 reinterpret_cast<a3*> (&a0) 迫使编译器把a0指针解释成a3。
不过这样做是错误的,任何时候都不要把父类转化成子类,否则必然会产生野指针。
2008-7-12 22:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢楼上的回答
在虚拟继承下,我加上(void*)可以正常编译,但运行出错啊。我想是不是因为在虚拟继承下,牵涉到编译器给对象的内存块加入了指针的原因啊?
你也是VC6吗?
2008-7-13 15:20
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=kusky;480162][1]为什么不用虚拟继承时,pa3=(A3*)&a0;编译和运行都没有问题呢?
为什么会有问题呢?(A3*)是强制类型转换,是c中使用的,等价于c++里的reinterpret_cast。这种转换产生了“编译器腐败”,即编译器不再检查转换是否正确。
[2]但只要一上虚拟继承就不可以了,即...[/QUOTE]

教育的好!!!膜拜!受教了。
2008-7-14 12:30
0
雪    币: 156
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你应该先看看 《深度探索C++对象模型》
2008-7-14 14:58
0
游客
登录 | 注册 方可回帖
返回
//