簡體   English   中英

C ++中組合關系的繼承

[英]Inheritance of composition relationship in C++

我經常面對這個問題。 假設我有以下課程:

class B
{
  public:
    virtual std::string className(){return "B";}
};

class A
{
  public:
    A()
    : _B(new B)
    {}

    virtual std::string className(){return "A";}

    virtual void desc()
    {
      std::cout << "I am " << className() << 
        " and I own: " << _B->className() << std::endl;
    }

  protected:
    B * _B;
};

然后,我想用新信息擴展AB 我確信SuperASuperB分別與AB具有“ is-a”關系。 直接的方法是嘗試繼承:

class SuperB: public B
{
  public:
    virtual std::string className(){return "SuperB";}
}

class SuperA: public A
{
  public:
    SuperA()
    : A()
    , _superB(new SuperB)
    {}

    virtual std::string className(){return "SuperA";}

    virtual void desc()
    {
      std::cout << "I am " << className() << 
        " and I own: " << _superB->className() << std::endl;
    }
  protected:
    SuperB * _superB;
};

但這顯然不好,因為SuperA實際上有兩個B :一個來自A類,另一個來自其SuperB類。 而且desc的覆蓋不是那么優雅。

我可以看到我可以在A B*上使用setter和getter,並在SuperA覆蓋它們以使用SuperB而不是B ,並且從不直接引用B*並始終使用getter,但這似乎有點干擾A

嘗試SuperA ,即讓SuperA擁有一個A*實例看起來也不好。

如果A不擁有單個B*而是說std::vector<B*> ,那就變得更加困難。

這是個常見的問題嗎? 有沒有我看不到的優雅解決方案?

您可能只讓A具有一個受保護的構造函數,該構造函數采用B*

class A {
public:
    A()
    : _B(new B)
    { }

protected:
    A(B* b)
    : _B(b)
    { }
};

以便:

class SuperA : public A {
public:
    SuperA()
    : A(new SuperB)
    { }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM