关于继承多个父类的函数入口地址的选择问题

大板牙花生 2018-07-04 08:51:50
class A{
a();
}
class B{
b();
}

class C:public A,public B{}

为何
C * n = new C();
B* x = reinterpret_cast<B*>(n);
x->b();为何这样不能正确执行了?这样执行总是会出现异常。

为何必须要调整A,B的继承顺序为B,A才能执行了?
...全文
298 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
池龙飞天 2018-07-13
  • 打赏
  • 举报
回复
刚验证了你的方法,正确,没有报错,可以执行
大板牙花生 2018-07-10
  • 打赏
  • 举报
回复
引用 9 楼 Saleayas 的回复:
B* x = n;
这样 是 B* x = static_cast<B*>(n);
这样不就好了。


我找到问题了哈 虽然不明白原理
老夏 2018-07-05
  • 打赏
  • 举报
回复
我好像在某个继承类里这样写过: n->B::b()
真相重于对错 2018-07-05
  • 打赏
  • 举报
回复
引用 6 楼 hou09tian 的回复:
x->b();

函数b()的地址是按类B的结构进行计算的,所以如果x的起点是类A的结构,则无法找到b()的地址;如果x的起点是类B的结构,则可以找到b()的地址。

你试过?????
调用某个虚函数 和 按什么顺序继承,完全没有关系。你改变了顺序,编译器会自动编排。调用的时候会自动找到那个虚函数。
棉猴 2018-07-05
  • 打赏
  • 举报
回复
x->b();

函数b()的地址是按类B的结构进行计算的,所以如果x的起点是类A的结构,则无法找到b()的地址;如果x的起点是类B的结构,则可以找到b()的地址。


Saleayas 2018-07-05
  • 打赏
  • 举报
回复
B* x = n; 这样 是 B* x = static_cast<B*>(n); 这样不就好了。
真相重于对错 2018-07-04
  • 打赏
  • 举报
回复
引用 3 楼 wter26 的回复:
[quote=引用 2 楼 hdt 的回复:]
reinterpret_cast 转换是一种直接二进制的转换,也可以说是不安全
你提供这段代码因为没有大问题。
请把出问题的代码贴出来

问题就在于我找不到问题在哪里,但是运行时异常,特别是涉及到了函数的指针地址的引用问题。[/quote]
这么说别人很难帮助你,试一下,virtual 继承
真相重于对错 2018-07-04
  • 打赏
  • 举报
回复
另外,能不能做到重现错误。
大板牙花生 2018-07-04
  • 打赏
  • 举报
回复
引用 2 楼 hdt 的回复:
reinterpret_cast 转换是一种直接二进制的转换,也可以说是不安全
你提供这段代码因为没有大问题。
请把出问题的代码贴出来

问题就在于我找不到问题在哪里,但是运行时异常,特别是涉及到了函数的指针地址的引用问题。
真相重于对错 2018-07-04
  • 打赏
  • 举报
回复
reinterpret_cast 转换是一种直接二进制的转换,也可以说是不安全
你提供这段代码因为没有大问题。
请把出问题的代码贴出来
大板牙花生 2018-07-04
  • 打赏
  • 举报
回复
可否有解决的办法?就是C++实现类似于JAVA的接口功能了?纯虚函数?

5,531

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧