私人继承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
个字段。我何时会使用私有继承,何时使用合成?
谢谢!
答案 0 :(得分:20)
This C++ FAQ entry 恰当地回答了您的问题。
在此复制:
尽可能使用合成,必要时使用私有继承。
通常,您不希望访问太多其他类的内部,而私有继承会为您提供一些额外的功能(和责任)。但私人继承并不邪恶;它的维护成本更高,因为它增加了某人改变会破坏你的代码的可能性。
私有继承的合法长期使用是当你想构建一个使用class Fred
中的代码的class Wilma
时,来自class Wilma
的代码需要调用成员函数来自您的新课程Fred
。在这种情况下,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";
}
};