子类中父类的c++数组

c++ array of parent class inside a child class

本文关键字:c++ 数组 父类 子类      更新时间:2023-10-16

假设我有两个类

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*/
};
  • BN个不同的A实例(数组)。

但是如果我这样做,B不知道A中包含的方法,并且我失去了我需要的类层次结构。

class B{
    /*with some attributes and methods*/
    private:
        A* a;
        unsigned int N; /*number of instances A*/
};
我当然可以将两者结合起来,但这似乎不是一个好主意,因为B将包含N+1实例A。我所说的+1是指A中包含的所有参数都将在B中继承。

是否有一种优雅的方式来结合我的两个需求?

在您的需求中有两个问题在起作用。

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

它们不是相互排斥的。事实上,复合模式是在子类型中同时使用这两种类型的典型例子。

当你说:

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

您正在使用经典的复合模式。如果将"A"answers"B"的名称改为"Object"answers"CompositeObject",画面会更清晰。

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一起工作,而是与AInterface一起工作,AB都实现了

你可以让B成为a的友类,这样你仍然可以访问数组的私有成员。

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

有一种优雅的方法来解决这个问题——处理非叶子类,比如AB,就好像它们是抽象的一样(无论是否使用来使抽象)。

这就是我的意思-使class CAB必须共同的部分。然后分别继承两个类,像这样:

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的实例,并继承N+1 - A的属性集。