繁体   English   中英

子类中父类的c ++数组

[英]c++ array of parent class inside a child class

假设我有两节课

class A{
    /*with some attributes and methods*/
};

class B{
    /*with some other attributes and methods*/
};

我的问题

我想有两件事似乎是相互排斥的...

  • B成为A的子代。 所以我想声明class B:public A

但是,如果我这样做,则B仅包含A “一组”属性

class B:public A{
    /*with some attributes and methods*/
};
  • B具有N的不同实例(数组) A

但是,如果我这样做了, B就不知道A包含的方法,那么我就会失去所需的类层次结构。

class B{
    /*with some attributes and methods*/
    private:
        A* a;
        unsigned int N; /*number of instances A*/
};

我当然可以将两者结合起来,但这似乎不是一个好主意,因为B将包含N+1实例A 我的意思是+1A包含的所有参数都将在B继承。

有没有一种巧妙的方法可以将我的两个要求结合在一起?

您的需求中存在两个问题。

  1. 类型继承。
  2. 对象组成。

它们并不相互排斥。 实际上, 复合模式是在子类型中同时使用两者的经典示例。

当你说:

class A
{
};

class B : public A
{
   A* aList;
   int N;
};

您正在使用经典的复合模式。 如果将名称AB更改为ObjectCompositeObject ,则图片将变得更清晰。

class Object
{
};

class PrimitiveObject : public Object
{
};

class CompositeObject : public Object
{
   Object* objectList;
   int N;
};

在这种模式下, objectList中的对象之一可以是CompositeObject

我认为您想要的是

class AInterface
{
public:
   virtual void ChangeFoo() = 0;
};

class A : public AInterface
{
public:
  virtual void ChangeFoo()
  {
  }
;


class B : public AInterface
{
public:
   virtual void ChangeFoo()
   {
     for( A a : allAsOwnedBythis())
     {
         a.ChangeFoo();
     }
   }
};

因此,您永远不会使用A或B,而是使用AB都实现的AInterface

您可以将B设为A的朋友类,这样您仍然可以访问该数组的私有成员。

class A {
    friend class B;
    ...
};

class B {
    A* a;
    int n;
};

有一种解决此问题的优雅方法-将非叶类(例如AB )视为抽象类(有或没有使它们抽象)。

这就是我的意思-使class C具有对于AB必须相同的部分。 然后分别继承两个类,如下所示:

class C {
    // The common parts
};
class A : public C {
    // Parts specific to A
};
class B : public C {
    // Parts specific to B
private:
    A* a; // Depending on your design, this could be C*, not A*
    unsigned int N;
};

这使您的class B继承它需要与class A共享的部分,而不必成为A的实例,并且可以继承A的第N+1个属性集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM