C++私有继承(一)

 更新时间:2022年01月23日 17:19:20   作者: Coder梁  
这篇文章主要介绍了C++私有继承,在私有继承当中,基类的公有成员和保护成员都会成为派生类的私有成员。这意味着基类的方法都会被private关键字描述,我们可以在派生类中使用它,但类对象无法直接调用,下面来看看详细内容吧

文章转自微信公众号:Coder梁(ID:Coder_LT)

1.私有继承介绍

我们可以将一个类作为另外一个类的成员,这样可以描述has-a的关系,即包含关系。

例如我们要创建一个Student类,它当中要包含一个string类型的name,和valarray类型的scores。这里的valarray是C++中的一个模板类,它可以理解成一个泛型的数组,有些类似于vector和array,但提供的功能更多。比如拥有min, size, max, sum等方法。

除了使用成员变量来描述has-a关系之外,我们还可以使用私有继承。

在私有继承当中,基类的公有成员和保护成员都会成为派生类的私有成员。这意味着基类的方法都会被private关键字描述,我们可以在派生类中使用它,但类对象无法直接调用。

2.语法

首先我们来看看私有继承的语法,其实和共有继承类似,只不过将public关键字替换为private,另外由于继承关系默认为private,所以也可以不填。

using namespace std;
class Student : private string, private valarray<double> {
  ...  
};

这里的private都可以省略。

其次是构造函数中成员列表初始化的处理,如果是常规的成员定义方式,即:

class Student {
 private:
     string name;
     valarray<double> scores;
};

我们的构造函数签名可以这么写:

Student(const string& n, const double *pd, int n): name(n), scores(pd, n) {}

但我们这个例子当中用的是私有继承,存储的值都在基类当中,所以我们只能通过类名来进行初始化:

Student(const string& n, const double *pd, int n): string(n), valarray<double>(pd, n) {}

为了书写方便,我们可以定义一个类型转换,将valarray<double> 替换为ArrayDb,于是上述的代码可以写成这样:

Student(const string& n, const double *pd, int n): string(n), ArrayDb(pd, n) {}

Student(const string& n, const double *pd, int n): string(n), ArrayDb(pd, n) {}

3.类声明代码

最后, 我们来看下完整的类声明的代码:

using namespace std;

class Student: string, valarray<double> {
   private:
     typedef valarray<double> ArrayDb;
     ostream & arr_out(ostream &os) const;
    public:
     Student(): string("null"), ArrayDb() {}
     explicit Student(const string & s): string(s), ArrayDb() {}
     explicit Student(int n): string("null"), ArrayDb(n) {}
     Student(const string& s, int n): string(s), ArrayDb(n) {}
     Student(const string& s, const ArrayDb& a): string(s), ArrayDb(a) {}
     Student(const char* str, const double *pd, int n): string(str), ArrayDb(pd, n) {}
     ~Student() {}
     double Average() const;
     double & operator[](int i);
     double operator[](int i) const;
     const string& Name() const;
     friend istream & operator>>(istream &is, Student &stu);
     friend istream & getline(istream &is, Student& stu);
     friend ostream & operator<<(ostream &os, const Student &stu);
};

到此这篇关于C++私有继承(一)的文章就介绍到这了,更多相关C++私有继承 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • VSCode配置C/C++语言环境(2023最新版)

    VSCode配置C/C++语言环境(2023最新版)

    这篇文章主要介绍了VSCode配置C/C++语言环境(2023最新版)的全过程,本文给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • C++实现LeetCode(153.寻找旋转有序数组的最小值)

    C++实现LeetCode(153.寻找旋转有序数组的最小值)

    这篇文章主要介绍了C++实现LeetCode(153.寻找旋转有序数组的最小值),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++ deque/queue/stack的底层原理解析

    C++ deque/queue/stack的底层原理解析

    这篇文章主要介绍了C++ deque/queue/stack的底层原理解析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 浅析c与c++中struct的区别

    浅析c与c++中struct的区别

    c与c++中struct的区别你是否了解,下面小编就详细的为大家介绍一下
    2013-07-07
  • C/C++实现控制台输出不同颜色字体的方法

    C/C++实现控制台输出不同颜色字体的方法

    这篇文章主要介绍了C/C++实现控制台输出不同颜色字体的方法,涉及C++控制台文字属性相关设置操作技巧,需要的朋友可以参考下
    2017-09-09
  • C语言实现CRC校验算法的示例详解

    C语言实现CRC校验算法的示例详解

    CRC(Cyclic Redundancy Check,循环冗余校验)是一种常用的错误检测技术,用于验证数据在传输或存储过程中是否发生了错误,本文主要介绍了C语言如何实现CRC校验算法,需要的可以参考一下
    2023-08-08
  • C++ 命名空间避免命名冲突的实现

    C++ 命名空间避免命名冲突的实现

    命名空间是C++中用来避免命名冲突的一种机制,本文主要介绍了C++ 命名空间避免命名冲突的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • C语言函数多个返回值方式

    C语言函数多个返回值方式

    这篇文章主要介绍了C语言函数多个返回值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C语言进阶教程之函数指针详解

    C语言进阶教程之函数指针详解

    函数指针是一个指针变量,它可以存储函数的地址,然后使用函数指针,下面这篇文章主要给大家介绍了关于C语言进阶教程之函数指针的相关资料,需要的朋友可以参考下
    2022-04-04
  • 使用Qt实现监听网页是否响应并导出Excel表

    使用Qt实现监听网页是否响应并导出Excel表

    Qt导出数据到excel,方法有很多,下面这篇文章主要给大家介绍了关于使用Qt实现监听网页是否响应并导出Excel表的相关资料,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-11-11

最新评论