C++ 私人会员vs私人惯性 我有一个类a,我无法编辑该类: 我想创建一个使用thisCoolFunction()的类(我们称它为classB或C)
我希望用户能够创建C++ 私人会员vs私人惯性 我有一个类a,我无法编辑该类: 我想创建一个使用thisCoolFunction()的类(我们称它为classB或C),c++,inheritance,private,private-members,C++,Inheritance,Private,Private Members,我希望用户能够创建B或C的实例,但他无权访问ThisCoolFunction() 我认为一个解决方案是执行私有继承: struct logic_error : public exception { }; 我还想过要有一个a类型的private成员: 这两种解决方案似乎有效: 问题:我应该如何比较这两种解决方案?我如何选择哪个更适合我的项目?其中一个更快吗?还是需要更多的记忆?用户是否更普遍地认可其中一种方法?这两种方法称为:和 因为这两种方法都能解决您的问题,所以您的问题的答案应该是
B
或C
的实例,但他无权访问ThisCoolFunction()
私有继承:
struct logic_error : public exception {
};
- 我还想过要有一个
类型的a
成员:private
- 这两种解决方案似乎有效:
问题:我应该如何比较这两种解决方案?我如何选择哪个更适合我的项目?其中一个更快吗?还是需要更多的记忆?用户是否更普遍地认可其中一种方法?这两种方法称为:和 因为这两种方法都能解决您的问题,所以您的问题的答案应该是针对您的应用程序的
设计模式
继承(public)表示两个类之间的is-a
关系,而组合表示has-a
关系
在私有继承
的情况下,更像是派生有一个基,这听起来不对,因为这是合成的工作,而不是任何类型的继承。既然私有继承和组合在逻辑上基本上是同一回事,那么选择哪一个呢
您需要决定什么样的关系对您的应用程序更有意义(类A
和类B
)
如果答案是B
has-aa
,那么使用合成(第二种方法)
如果答案是B
是-aa
,那么使用继承(您的第一种方法)
在您发布的示例中,我肯定会选择组合(您可以组合多个相同类型的内容),一些样式指南(例如)甚至建议永远不要使用私有继承,原因与我已经编写的类似-私有继承只是有点混乱
例如(组合与公共继承)
类多边形的最佳设计将使用合成
,因为此语句有意义多边形具有有序的点序列
,但不是此多边形是有序的点序列
。在C++中:
class Polygon {
std::vector<Point> points;
};
看看这个
参见此部分。私有继承也会禁用强制转换,即不再允许使用A*A=&b
。不确定这是否真的是关于SO的主题(可能更多关于程序员),因此是一个注释而不是答案。这就是组合和继承之间的区别。最好的论据是,从模型的角度来看,B类是a类还是a类。例如,一名学生是人(此处优先继承),但一辆汽车有一个马达(此处优先组合)。原因不应该是技术上的,而应该是从建模的角度来看关系是什么。相关的:因为私有继承比组合增加了更多的维护工作量。从长远来看,您可能还必须处理多重继承。私有继承不是“is-a”(即公共继承),而是“has-a”。从外部来看,私有继承和组合之间并没有太大区别
class C{
A memberA;
int member;
public:
void setCMember(){
member = memberA.thisCoolFuntion();
}
};
int main(int argc, const char * argv[]) {
// insert code here...
B b;
b.setBMember();
//b.thisCoolFuntion(); --> Error!
C c;
c.setCMember();
//c.memberA.thisCoolFuntion(); --> Error!
return 0;
}
class Polygon {
std::vector<Point> points;
};
struct logic_error : public exception {
};