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

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

  •  
  •   810244966 · 8 天前 · 953 次点击

    是这样的,我有类 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
        1
    sbw   8 天前   ♥ 1
    cast 到 A* 的时候,只能由 B* 或 C* cast 过去,不能由 D* cast 过去。
    由 B* 或 C* 初始化 A* 的时候,就可以确定调用哪个版本
        2
    FelixLiu   8 天前
    为什么要用多继承,闲的慌?
        3
    FelixLiu   8 天前
    使用多继承说明你面向对象设计有问题,类的关系没有梳理清楚。
        4
    810244966   8 天前
    @FelixLiu 多继承是不好的行为啊,我还是大一的学生,刚刚学完多态,不清楚,以为 UML 图越复杂越好 @@@@@
        5
    SupperMary   8 天前 via Android
    歪个楼,这种图怎么画的
        7
    catror   8 天前 via Android
    调用时把类名带上,不过这样的设计应该尽量避免。
        8
    810244966   8 天前   ♥ 1
    @SupperMary 我是用 Visio 画的。 你可以去咸鱼上买个这个软件的序列号,然后绑定你的账号或者机器
        9
    810244966   8 天前
    @catror 貌似不行啊,我带了类名还是没用,报错:不明确
        10
    vincel   8 天前   ♥ 2
    带上作用域 p->A::fun();
        11
    dfjslkjdf   7 天前
    ::
        12
    iwong0exv2   7 天前 via Android
    避免多重继承,不要花心思去想这些问题,多学点其他真正有用的。
        13
    lrh3321   7 天前 via Android
    与其多继承,还不如写几个不同名字的函数出来。
        14
    lazydog   7 天前 via Android
    p->(A*)(B*)fun(); or p->(A*)(C*)fun(); 你需要进行上行转换,具体可参考菱形继承那块,以上仅个人之见。
        15
    GeruzoniAnsasu   7 天前   ♥ 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   7 天前 via Android
    @SupperMary
    @810244966
    貌似 VS 可以自动生成~我去年交实验就自动生成的~
        17
    nmgwddj   7 天前
    经典的钻石继承模型。
        18
    810244966   7 天前
    谢谢上述的大家帮我解决问题,这是我第一次在 V 站上发帖,大家都挺热情的。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2548 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 21ms · UTC 11:26 · PVG 19:26 · LAX 04:26 · JFK 07:26
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1