子类中父类的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
。我所说的+1
是指A
中包含的所有参数都将在B
中继承。
是否有一种优雅的方式来结合我的两个需求?
在您的需求中有两个问题在起作用。
- 类型继承。
- 对象组成。
它们不是相互排斥的。事实上,复合模式是在子类型中同时使用这两种类型的典型例子。
当你说:
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
一起工作,A
和B
都实现了
你可以让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
的实例,并继承N+1
- A
的属性集。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '