C++ 继承--用示例程序解释公共与私有与受保护

举报
Tiamo_T 发表于 2021/09/30 18:06:04 2021/09/30
【摘要】 在 C++ 中,最常见的继承类型是 public。公共继承类型用于扩展具有某些功能或某些数据成员的父类。这种类型的公共继承有时被称为“是”,因为父类和子类具有相同的类型,并且可以通过转换看到,其中子类比父类拥有更多。私有继承是不同类型的,它是“has”类型的。这意味着私有继承适用于我们需要防止主程序意外访问从父类继承的一些方法的情况。受保护的继承比私有的限制更少,当我们需要祖父类的一些实现时...

在 C++ 中,最常见的继承类型是 public。

公共继承类型用于扩展具有某些功能或某些数据成员的父类。

这种类型的公共继承有时被称为“是”,因为父类和子类具有相同的类型,并且可以通过转换看到,其中子类比父类拥有更多。

私有继承是不同类型的,它是“has”类型的。

这意味着私有继承适用于我们需要防止主程序意外访问从父类继承的一些方法的情况。

受保护的继承比私有的限制更少,当我们需要祖父类的一些实现时它很有用。

下表将说明这种差异:

公共成员 受保护成员 私有成员
公共继承 公共 受保护 私有
受保护的继承 受保护 受保护  私有
私有继承 私有 私有 私有

从上表中我们可以看出,私有继承是最严格的,而受保护的则介于私有和公有类型之间。

私有继承示例程序

为了理解如何使用私有继承,让我们看下面使用两个类的示例程序:父类和子类。

# cat p1.cpp
#include <iostream>

using namespace std;

class Parent{
public:
  void parentMethod( void ){ cout<<"Inside parent method"<<endl;}
};

class Child : private Parent{
public:
  void childMethod( void){
    cout<<"Inside child method"<<endl;
    parentMethod();
  }
};

int main( void ){
  Child C;
  C.childMethod();
  return 0;
}

在上面的示例代码中:

  • 我们创建了一个名为“C”的 Child 类型的对象
  • 然后我们应用了 childMethod(),它有一些消息,它将依次调用放置在其主体中的方法 parentMethod()。
  • 如果您尝试在对象“C”上调用方法 parentMethod(),您将收到错误消息。从这里我们观察到私有继承最重要的特性,它会禁止子对象意外访问一些可以通过公共继承继承的父级方法。

以下是上述程序的输出:

# g++ p1.cpp

# ./a.out
Inside child method
Inside parent method

受保护的继承示例代码

以下示例说明了如何在程序中使用受保护的继承。

# cat p2.cpp
#include <iostream>

using namespace std;

class GrandParent{
public:
  void grandParentMethod( void ){ cout<<"Method in the grand parent class"<<endl; }
};

class Parent : protected GrandParent{
public:
  void parentMethod( void ){ cout<<"Method in the parent class"<<endl; }
};

class Child: protected Parent{
public:
  void 
  childMethod( void ){
    cout<<"Method in the child class"<<endl;
    parentMethod();
    grandParentMethod();
  }
};

int 
main( void ){

  Child C;
  C.childMethod();
  return 0;

}

在上面的示例代码中:

  • 我们用类创建了三级继承:祖父级、父级和子级。
  • 从这个链中,我们在每个类中都有一个方法。
  • main 函数有一个 Child 类型的对象,之后我们调用方法 childMethod(),它有两个调用 parentMethod() 和 grandParentMethod()。

以下是上述程序的输出:

# g++ p2.cpp

# ./a.out
Method in the child class
Method in the parent class
Method in the grand parent class

从这两个例子中,我们已经了解了这种类型的继承是如何实现的。

现在,我需要说的是,在这种情况下,我们在父类中使用了受保护的继承,如果我们在第二层链继承中使用了私有继承,我们最终会得到一个错误消息。

为了充分利用这两种类型的继承,我将向您展示如何使用父类中的特定方法,如果我们在子类中使用某些名称方法重载它。

该任务应通过以下三种方式完成:

  • Parent::parentMethod();
  • using Parent::Method();
  • Object.Parent::parentMethod().

换句话说,如果子类对父类隐藏了一些方法,我们已经提到了访问隐藏方法的方法。

私有继承与受保护继承

除了语法上的差异之外,我们还了解到私有继承比受保护继承更具限制性,并且这种差异很重要。

由此我们将知道我们应该用私有继承打破继承链,还是应该用受保护的继承来保留实现。

因此,如果您想在父类中使用实现而不是在子类中使用私有类,但如果您也想在子类中使用实现,则您拥有受保护的继承。

因此,我们可以说私有和受保护的继承将保留实现,但它会创建对接口的限制。

使用包含与私有和受保护的继承

从技术上讲,如果我们有一个班级在另一个班级中,就会使用遏制。顺便说一句,我们也可以拥有其他类类型的指针,甚至是其他类类型的引用。

包含也是“有”类型的两个类之间的关系。

即,该类可能与其他类有一些关系,这在某些情况下会很有用。

您通常更有可能使用包含,而不是私有或受保护的继承。

使用私有或受保护继承的场景

让我们考虑一下这种情况。程序员正在开发包含数组和二进制搜索方法的父类。

从这个类我们创建子类,它不会以排序的方式存储已经提到的数组的元素。

所以,我们想在我们的子对象的 main 函数中使用数组,但我们不允许使用二分查找,因为为了使用二分查找数组需要排序。

这在我们与更多程序员一起开发程序的情况下很有用。

当我们也需要限制对父方法的访问时,这种类型的继承对于虚函数可能很有用。

我们需要使用这种类型继承的另一种情况是多重继承。为此,我们需要至少有两个父级,并且其中一种方法应该无法从我们的类外部访问。

基于这个想法,我相信你自己也会发现很少的情况。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。