是这样的,我有类 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 1
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 2
带上作用域 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 2
本来想扯一堆虚继承和多态的玩意,但差点把自己也绕晕了,这东西画图解释都麻烦得很,还是算了
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 站上发帖,大家都挺热情的。
|