V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
810244966
V2EX  ›  C

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

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

    是这样的,我有类 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   ·   实用小工具   ·   2787 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:20 · PVG 15:20 · LAX 23:20 · JFK 02:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.