私有继承 VS 组合:何时使用哪个?
Posted
技术标签:
【中文标题】私有继承 VS 组合:何时使用哪个?【英文标题】:Private inheritance VS composition : when to use which? 【发布时间】:2011-08-26 18:26:27 【问题描述】:私有继承 VS 组合。
我有点困惑何时使用它们。由于私有继承在某种程度上密封了继承链,给定:
class A
private:
int z;
protected:
int y;
public:
int x;
;
class B : private A
/* B's data members and methods */
/* B has access only to A's public and protected */
;
class C : public B
/* can access no fields of B */
;
C
将无法使用B
的任何字段。什么时候使用私有继承,什么时候使用组合?
谢谢!
【问题讨论】:
请用您要询问的特定编程语言标记问题。 When to use C++ private inheritance over composition?的可能重复 【参考方案1】:This C++ FAQ entry 恰当地回答您的问题。
在这里复制它:
尽可能使用组合,必要时使用私有继承。
通常您不想访问太多其他类的内部,而私有继承为您提供了一些额外的权力(和责任)。但是私有继承并不邪恶。它的维护成本更高,因为它增加了有人更改会破坏您的代码的东西的可能性。
私有继承的合法长期用途是当您想要构建一个使用class Wilma
中的代码的class Fred
,并且来自class Wilma
的代码需要调用来自您的新类的成员函数,@ 987654325@。在这种情况下,Fred
调用Wilma
中的非虚拟对象,Wilma
调用本身(通常是纯虚拟对象),它们被Fred
覆盖。这对于合成来说会更难。
class Wilma
protected:
void fredCallsWilma()
std::cout << "Wilma::fredCallsWilma()\n";
wilmaCallsFred();
virtual void wilmaCallsFred() = 0; // A pure virtual function
;
class Fred : private Wilma
public:
void barney()
std::cout << "Fred::barney()\n";
Wilma::fredCallsWilma();
protected:
virtual void wilmaCallsFred()
std::cout << "Fred::wilmaCallsFred()\n";
;
【讨论】:
我不太明白“因为它增加了某人更改某些内容会破坏您的代码的可能性。”。与公共继承不一样吗?如果代码由于受保护成员的更改而中断,难道不是基类的错,而不是派生的错吗?以上是关于私有继承 VS 组合:何时使用哪个?的主要内容,如果未能解决你的问题,请参考以下文章