[英]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
我的意思是+1
, A
包含的所有参数都将在B
继承。
有没有一种巧妙的方法可以将我的两个要求结合在一起?
您的需求中存在两个问题。
它们并不相互排斥。 实际上, 复合模式是在子类型中同时使用两者的经典示例。
当你说:
class A
{
};
class B : public A
{
A* aList;
int N;
};
您正在使用经典的复合模式。 如果将名称A
和B
更改为Object
和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,而是使用A
和B
都实现的AInterface
您可以将B设为A的朋友类,这样您仍然可以访问该数组的私有成员。
class A {
friend class B;
...
};
class B {
A* a;
int n;
};
有一种解决此问题的优雅方法-将非叶类(例如A
和B
)视为抽象类(有或没有使它们抽象)。
这就是我的意思-使class C
具有对于A
和B
必须相同的部分。 然后分别继承两个类,如下所示:
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.