天堂里的死神 程序员  2013年05月09日
“菱形继承”在gcc下无法从派生类cast到基类的问题。
gcc4.7.3
下面的代码error处编译不过,想请问怎么能绕过这个检查,使得可以直接从Foo指针转换为A指针?


class A
{};
class B : public A
{};
class C : public A
{};

class Foo
: public A
, public B
, public C
{};



int main()
{
Foo* f = new Foo();
B *ptrb = (B*)(Foo*)f;
C *ptrc = (C*)(Foo*)f;
A *ptr = (A*)(Foo*)f; // error

cout << "Hello world!" << endl;
return 0;
}


VC下正常通过,不会导致编译错误。


传统的菱形继承导致的问题是这样的,这个我会绕,也很能理解,确实从Foo到A,不知道到底是B的A还是C的A。

class A
{};
class B : public A
{};
class C : public A
{};

class Foo
: public B
, public C
{};



int main()
{
Foo* f = new Foo();
A *ptr = (A*)(B*)(Foo*)f;
cout << "Hello world!" << endl;
return 0;
}

不过在最上面的例子中,我已经是写明了Foo是更优先从A派生的,这时如果我需要A的指针,是希望编译器能够放我一马的。

请不要问为什么不用virtual继承什么的,那样跑题了,我现在是要在gcc下编译某个第三方库,没法修改第三方库的头文件,而且这里必须要获取到A在Foo中的偏移……所以,总之,请不要问我为什么要这么做,我只想知道gcc这里能不能用什么办法给绕过去……

多谢!!
...全文
191 点赞 收藏 18
写回复
18 条回复

还没有回复,快来抢沙发~

发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告