C++中的私有继承
私有继承
私有继承是一种不同的方法,在这种方法中我们可以实现 “有 “关系。在私有继承的帮助下,我们可以将类中的保护成员和公共成员转换为类中的私有成员。这意味着在实现了私有成员类后,该成员类的所有基础都变成了私有类。然而,我们可以在派生类的成员函数中实现这些私有类。
让我们通过一个程序来简单了解一下私有继承。
class Person {};
class Student:private Person {}; // private
void eat(const Person& p){} // anyone can eat
void study(const Student& s){} // only students study
int main()
{
Person p; // p is a Person
Student s; // s is a Student
eat(p); // fine, p is a Person
eat(s); // error! s isn't a Person
return 0;
}
在上面的程序中,在公共继承中,如果两个类之间的关系被设置为私有类,那么编译器就不能将派生类转化为基类。这就是为什么函数eat()不能被对象S调用。
在公有继承的情况下,基类的公有方法成为派生类的公有方法。换句话说,我们可以说派生类在继承的帮助下继承了基类的属性。这是一种IS-A关系。但是在私有继承的情况下,基类的公共方法成为派生类的私有方法,即使基类是受保护的或公共的。在这里,派生类并不继承基类的属性。
但在私有继承的情况下,我们应该非常小心。私有继承是非常混乱的。这里,继承并不意味着拥有。假设父母把特殊糖果的秘密配方给了孩子,但有一个条件是要保守这个秘密。孩子被允许将不同品种的糖果送给别人,但不允许分享该糖果的配方。在私有继承的帮助下,派生类可以由基类实现,但不属于基类。因此,派生类不会向外界展示其界面。唯一展示给外界的是产品。
在私有继承的帮助下,一个类可以被实现者继承。类的声明可以被作为接口的用户直接访问。用户也可以通过类声明间接地访问实现类。
例子
#include
using namespace std;
class Engine
{
public:
Engine(int nc){
cylinder = nc;
}
void start() {
cout << getCylinder() <<" cylinder engine started" << endl;
};
int getCylinder() {
return cylinder;
}
private:
int cylinder;
};
class Car : private Engine
{ // Car has-a Engine
public:
Car(int nc = 4) : Engine(nc) { }
void start() {
cout << "car with " << Engine::getCylinder() <<
"cylinder engine started" << endl;
Engine:: start();
}
};
int main( )
{
Car c(8);
c.start();
return 0;
}
输出。
解释。
正如我们从这个例子中看到的, 汽车 类最终会有一个继承的 引擎 组件,如 气缸。 Car 方法可以在内部使用引擎方法 getCylinder() 来访问引擎组件– 气缸。
结论
- 当你处理两个 没有 is-a 关系的类时,私有继承最有可能成为一种合法的设计策略,其中一个类需要访问另一个类的受保护成员,或者需要重新定义它的一个或多个虚拟函数。”
- “私有继承意味着 is-implemented-in-terms-of 。 它通常比组成要差。”
- “如果你让类 D 私有地继承于类 B, 你这样做是因为你对利用类 B 中的一些功能感兴趣 , 而不是因为 B 和 D 类型的对象之间存在任何概念上的关系 。 “
- “私有继承在 软件设计 中没有意义 , 只有在 软件实现 中才有意义 。 “