有个 C++的继承问题,希望大佬们能回答下

2019-05-16 16:46:45 +08:00
 810244966

是这样的,我有类 A B C D 其中 A 派生出 B 和 C,D 又是继承 B 和 C 出来的。 A 中有个纯虚函数,B 和 C 都定义了这个函数。。 我如何通过一个指向 D 的 A 类指针调用 B 和 C 中的这个函数呢? www.hmchxd.com/V2EX_picture.png 这个网址是这个程序的 UML 类图。 描述有点困难,大家还是看图比较好

2880 次点击
所在节点    C
18 条回复
sbw
2019-05-16 17:18:29 +08:00
cast 到 A* 的时候,只能由 B* 或 C* cast 过去,不能由 D* cast 过去。
由 B* 或 C* 初始化 A* 的时候,就可以确定调用哪个版本
FelixLiu
2019-05-16 18:01:18 +08:00
为什么要用多继承,闲的慌?
FelixLiu
2019-05-16 18:02:30 +08:00
使用多继承说明你面向对象设计有问题,类的关系没有梳理清楚。
810244966
2019-05-16 18:04:42 +08:00
@FelixLiu 多继承是不好的行为啊,我还是大一的学生,刚刚学完多态,不清楚,以为 UML 图越复杂越好 @@@@@
SupperMary
2019-05-16 18:10:31 +08:00
歪个楼,这种图怎么画的
H2NCH2COOH
2019-05-16 18:10:55 +08:00
catror
2019-05-16 18:18:35 +08:00
调用时把类名带上,不过这样的设计应该尽量避免。
810244966
2019-05-16 18:19:07 +08:00
@SupperMary 我是用 Visio 画的。 你可以去咸鱼上买个这个软件的序列号,然后绑定你的账号或者机器
810244966
2019-05-16 18:20:05 +08:00
@catror 貌似不行啊,我带了类名还是没用,报错:不明确
vincel
2019-05-16 18:24:48 +08:00
带上作用域 p->A::fun();
dfjslkjdf
2019-05-16 20:21:39 +08:00
::
iwong0exv2
2019-05-16 20:24:48 +08:00
避免多重继承,不要花心思去想这些问题,多学点其他真正有用的。
lrh3321
2019-05-16 21:13:25 +08:00
与其多继承,还不如写几个不同名字的函数出来。
lazydog
2019-05-16 21:46:58 +08:00
p->(A*)(B*)fun(); or p->(A*)(C*)fun(); 你需要进行上行转换,具体可参考菱形继承那块,以上仅个人之见。
GeruzoniAnsasu
2019-05-16 23:40:39 +08:00
本来想扯一堆虚继承和多态的玩意,但差点把自己也绕晕了,这东西画图解释都麻烦得很,还是算了


A *p = new D;
dynamic_cast<B*>(p) -> B::f();


1. 由于 p 是个 A 指针,所以进行的是 down cast
2. 虚基类指针不能被 static_cast 成派生类指针,必须 dynamic_cast
3. 由于虚函数的多态特性,不管指针被转成了 A 还是 B 还是 C, 不加 namespace 限定符调用的还是 D::f(),所以要显式 B::f()
4. 综合 2/3,dynamic_cast 成 B 或者 B 的派生类指针,都包含 B 的虚表成员,所以 dynamic_cast<D*>(p) -> B::f() 效果一样


ps. 多继承只有一种正确用法: 组合成员
FancyKing
2019-05-17 00:47:22 +08:00
@SupperMary
@810244966
貌似 VS 可以自动生成~我去年交实验就自动生成的~
nmgwddj
2019-05-17 10:20:54 +08:00
经典的钻石继承模型。
810244966
2019-05-17 11:02:59 +08:00
谢谢上述的大家帮我解决问题,这是我第一次在 V 站上发帖,大家都挺热情的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/564771

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX