C++中的私有继承

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; 
}

输出。

C++中的私有继承

解释。

正如我们从这个例子中看到的, 汽车 类最终会有一个继承的 引擎 组件,如 气缸。 Car 方法可以在内部使用引擎方法 getCylinder() 来访问引擎组件– 气缸。

结论

  • 当你处理两个 没有 is-a 关系的类时,私有继承最有可能成为一种合法的设计策略,其中一个类需要访问另一个类的受保护成员,或者需要重新定义它的一个或多个虚拟函数。”
  • “私有继承意味着 is-implemented-in-terms-of 。 它通常比组成要差。”
  • “如果你让类 D 私有地继承于类 B, 你这样做是因为你对利用类 B 中的一些功能感兴趣 而不是因为 BD 类型的对象之间存在任何概念上的关系
  • “私有继承在 软件设计 中没有意义 只有在 软件实现 中才有意义

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程