如何设计类继承

时间:2020-05-27 08:52:51

标签: c++ inheritance

我为其他IA,IB,IC提供3个接口类。然后,我需要实现这3个接口类。我的实现方法如下,但是3类中a()的行为相同,如何重用代码。

class IA{
    virtual void a() = 0;
};

class IB : public IA{
    virtual void b() = 0;
};

class IC: public IA{
    virtual void c() = 0;
};


class A :public IA{
    void a(){}
};

class B :public IB{
    void a(){}
    void b(){}
};

class C :public IC{
    void a(){}
    void c(){}
};

1 个答案:

答案 0 :(得分:0)

有几种方法:

  • 创建常用功能:

    void f() { /*..*/ }
    
    class A : public IA{
        void a() override { f(); }
    };
    
    class B : public IB{
        void a() override { f(); }
        void b() override { /**/ }
    };
    
    class C : public IC{
        void a() override { f(); }
        void c() override { /**/ }
    };
    
  • 使用虚拟继承

    class IB : public virtual IA{
        virtual void b() = 0;
    };
    
    class IC : public virtual IA{
        virtual void c() = 0;
    };
    
    
    class A : public virtual IA{
        void a() override { /*..*/ }
    };
    
    class B : public A, public IB{
        void b() override { /**/ }
    };
    
    class C : public A, public IC{
        void c() override { /**/ }
    };
    
  • 使用模板/ CRTP

    template </*typename Derived,*/ typename Base>
    struct AImpl : public Base
    {
        void a() override { /*..*/ }
    };
    
    class A : public AImpl</*A,*/ IA> {
    };
    
    class B : public AImpl</*B,*/ IB> {
        void b() override { /**/ }
    };
    
    class C : public AImpl</*C,*/ IC> {
        void c() override { /**/ }
    };
    
  • 使用成分

    class A : public IA{
        void a() override { /**/ }
    };
    
    class B : public IB{
        void a() override { mA.a(); }
        void b() override { /**/ }
    private:
        A a;
    };
    
    class C : public IC{
        void a() override { mA.a(); }
        void c() override { /**/ }
    private:
        A a;
    };