【发布时间】:2020-09-04 00:29:26
【问题描述】:
- 我有一个班级
A,我无法编辑:
class A{
public:
int thisCoolFuntion(){
return 0;
}
};
- 我想创建一个使用
thisCoolFuntion()的类(我们称之为类B或C) -
我希望用户能够创建
B或C的实例,但他没有有权访问thisCoolFuntion()。 我认为一种解决方案是进行
private继承:
class B : A{
public:
int member;
void setBMember(){
member = thisCoolFuntion();
}
};
- 我还想过要有一个
private类型为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;
}
问题:我应该如何比较这两个解决方案?我如何选择哪一个更适合我的项目?其中一个更快吗?或者一个需要更多的内存?是用户更普遍认可的其中之一吗?
【问题讨论】:
-
私有继承也禁用强制转换,即
A* a = &b不再被允许。 -
不确定这是否真的是关于 SO 的话题(可能更多关于程序员),因此是评论而不是答案。这就是组合和继承的区别。最好的论点是从模型的角度来看,类 B 是 是一个 A还是有一个 A。例如,一个学生 是一个人(这里首选继承),但是汽车有一个电机(这里首选组合)。原因不应该是技术上的,而是从建模的角度来看是什么关系。
-
Use private inheritance when you have to 因为私有继承比组合增加了更多的维护工作量。从长远来看,您可能还必须处理多重继承。
标签: c++ inheritance private private-members