有个 C++的继承问题,希望大佬们能回答下 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
810244966
V2EX    C

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

  •  
  •   810244966 2019-05-16 16:46:45 +08:00 3201 次点击
    这是一个创建于 2351 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    18 条回复    2019-05-17 11:02:59 +08:00
    sbw
        1
    sbw  
       2019-05-16 17:18:29 +08:00   1
    cast 到 A* 的时候,只能由 B* 或 C* cast 过去,不能由 D* cast 过去。
    由 B* 或 C* 初始化 A* 的时候,就可以确定调用哪个版本
    FelixLiu
        2
    FelixLiu  
       2019-05-16 18:01:18 +08:00
    为什么要用多继承,闲的慌?
    FelixLiu
        3
    FelixLiu  
       2019-05-16 18:02:30 +08:00
    使用多继承说明你面向对象设计有问题,类的关系没有梳理清楚。
    810244966
        4
    810244966  
    OP
       2019-05-16 18:04:42 +08:00
    @FelixLiu 多继承是不好的行为啊,我还是大一的学生,刚刚学完多态,不清楚,以为 UML 图越复杂越好 @@@@@
    SupperMary
        5
    SupperMary  
       2019-05-16 18:10:31 +08:00 via Android
    歪个楼,这种图怎么画的
    catror
        7
    catror  
       2019-05-16 18:18:35 +08:00 via Android
    调用时把类名带上,不过这样的设计应该尽量避免。
    810244966
        8
    810244966  
    OP
       2019-05-16 18:19:07 +08:00   1
    @SupperMary 我是用 Visio 画的。 你可以去咸鱼上买个这个软件的序列号,然后绑定你的账号或者机器
    810244966
        9
    810244966  
    OP
       2019-05-16 18:20:05 +08:00
    @catror 貌似不行啊,我带了类名还是没用,报错:不明确
    vincel
        10
    vincel  
       2019-05-16 18:24:48 +08:00   2
    带上作用域 p->A::fun();
    dfjslkjdf
        11
    dfjslkjdf  
       2019-05-16 20:21:39 +08:00
    ::
    iwong0exv2
        12
    iwong0exv2  
       2019-05-16 20:24:48 +08:00 via Android
    避免多重继承,不要花心思去想这些问题,多学点其他真正有用的。
    lrh3321
        13
    lrh3321  
       2019-05-16 21:13:25 +08:00 via Android
    与其多继承,还不如写几个不同名字的函数出来。
    lazydog
        14
    lazydog  
       2019-05-16 21:46:58 +08:00 via Android
    p->(A*)(B*)fun(); or p->(A*)(C*)fun(); 你需要进行上行转换,具体可参考菱形继承那块,以上仅个人之见。
    GeruzoniAnsasu
        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. 多继承只有一种正确用法: 组合成员
    FancyKing
        16
    FancyKing  
       2019-05-17 00:47:22 +08:00 via Android
    @SupperMary
    @810244966
    貌似 VS 可以自动生成~我去年交实验就自动生成的~
    nmgwddj
        17
    nmgwddj  
       2019-05-17 10:20:54 +08:00
    经典的钻石继承模型。
    810244966
        18
    810244966  
    OP
       2019-05-17 11:02:59 +08:00
    谢谢上述的大家帮我解决问题,这是我第一次在 V 站上发帖,大家都挺热情的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5213 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 07:15 PVG 15:15 LAX 00:15 JFK 03:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86