是这样的,我有类 A B C D 其中 A 派生出 B 和 C,D 又是继承 B 和 C 出来的。 A 中有个纯虚函数,B 和 C 都定义了这个函数。。 我如何通过一个指向 D 的 A 类指针调用 B 和 C 中的这个函数呢? www.hmchxd.com/V2EX_picture.png 这个网址是这个程序的 UML 类图。 描述有点困难,大家还是图比较好
1 sbw 2019-05-16 17:18:29 +08:00 ![]() cast 到 A* 的时候,只能由 B* 或 C* cast 过去,不能由 D* cast 过去。 由 B* 或 C* 初始化 A* 的时候,就可以确定调用哪个版本 |
2 FelixLiu 2019-05-16 18:01:18 +08:00 为什么要用多继承,闲的慌? |
3 FelixLiu 2019-05-16 18:02:30 +08:00 使用多继承说明你面向对象设计有问题,类的关系没有梳理清楚。 |
![]() | 4 810244966 OP @FelixLiu 多继承是不好的行为啊,我还是大一的学生,刚刚学完多态,不清楚,以为 UML 图越复杂越好 @@@@@ |
![]() | 5 SupperMary 2019-05-16 18:10:31 +08:00 via Android 歪个楼,这种图怎么画的 |
6 H2NCH2COOH 2019-05-16 18:10:55 +08:00 |
![]() | 7 catror 2019-05-16 18:18:35 +08:00 via Android 调用时把类名带上,不过这样的设计应该尽量避免。 |
![]() | 8 810244966 OP ![]() @SupperMary 我是用 Visio 画的。 你可以去咸鱼上买个这个软件的序列号,然后绑定你的账号或者机器 |
10 vincel 2019-05-16 18:24:48 +08:00 ![]() 带上作用域 p->A::fun(); |
11 dfjslkjdf 2019-05-16 20:21:39 +08:00 :: |
12 iwong0exv2 2019-05-16 20:24:48 +08:00 via Android 避免多重继承,不要花心思去想这些问题,多学点其他真正有用的。 |
![]() | 13 lrh3321 2019-05-16 21:13:25 +08:00 via Android 与其多继承,还不如写几个不同名字的函数出来。 |
![]() | 14 lazydog 2019-05-16 21:46:58 +08:00 via Android p->(A*)(B*)fun(); or p->(A*)(C*)fun(); 你需要进行上行转换,具体可参考菱形继承那块,以上仅个人之见。 |
15 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. 多继承只有一种正确用法: 组合成员 |
![]() | 16 FancyKing 2019-05-17 00:47:22 +08:00 via Android |
![]() | 17 nmgwddj 2019-05-17 10:20:54 +08:00 经典的钻石继承模型。 |
![]() | 18 810244966 OP 谢谢上述的大家帮我解决问题,这是我第一次在 V 站上发帖,大家都挺热情的。 |