• C++PrimerPlus(第6版)中文版:Chapter14.2私有继承use_stui


    本小节主要讲私有继承。

    私有继承也可以用来实现has-a的关系。

    共有继承的时候需要将对象作为一个命名的成员对象添加到类中。(例如student 类中有个string name ,那么这个name 就是string类的对象了,这个需要显式去声明)。

    私有继承的时候是将对象作为一个未被命名的继承对象添加到类中。

    私有继承提供的特性与包含是相同的:获得实现,但不获得接口。

    下面的例子中,Student类重新写了,但是它对外提供的接口没有变,因此主函数所在的文件和上一个例子包含是一样的。

    studenti.h

    1. //studenti.h-- defining a Student class using private inheritance 使用私有继承 定义一个学生类
    2. #pragma once
    3. #include
    4. #include
    5. #include
    6. class Student :private std::string, private std::valarray<double>
    7. {
    8. private:
    9. typedef std::valarray<double> ArrayDb;
    10. //private method for scores output
    11. std::ostream& arr_out(std::ostream & os)const;
    12. public:
    13. Student():std::string("Null Student"),ArrayDb(){}
    14. explicit Student(const std::string & s):std::string(s),ArrayDb(){}
    15. explicit Student(int n) :std::string("Nully"), ArrayDb(n) {}
    16. Student(const std::string& s,int n) :std::string(s), ArrayDb(n) {}
    17. Student(const std::string& s, const ArrayDb & a) :std::string(s), ArrayDb(a) {}
    18. Student(const char * str, const double * pd,int n) :std::string(str), ArrayDb(pd,n) {}
    19. ~Student(){}
    20. double Average() const;
    21. double & operator[](int i);
    22. double operator[](int i)const;
    23. const std::string& Name() const;
    24. //friends
    25. friend std::istream& operator >>(std::istream & is,Student & stu);//1 word
    26. friend std::istream& getline(std::istream& is, Student& stu);//1 line
    27. //output
    28. friend std::ostream& operator<<(std::ostream& os,const Student & stu);
    29. };

    studenti.cpp

    1. #include "studenti.h"
    2. using std::ostream;
    3. using std::endl;
    4. using std::istream;
    5. using std::string;
    6. //public method
    7. double Student::Average()const
    8. {
    9. if (ArrayDb::size() >0)
    10. return ArrayDb::sum() / ArrayDb::size();
    11. else
    12. {
    13. return 0;
    14. }
    15. }
    16. const string& Student::Name()const
    17. {
    18. return (const string&)*this;
    19. }
    20. double & Student::operator[](int i)
    21. {
    22. return ArrayDb::operator[](i);//use ArrayDb::operator[]()
    23. }
    24. double Student::operator[](int i)const
    25. {
    26. return ArrayDb::operator[](i);
    27. }
    28. //private method
    29. ostream& Student::arr_out(ostream& os)const
    30. {
    31. int i;
    32. int lim = ArrayDb::size();
    33. if (lim > 0)
    34. {
    35. for (i = 0; i < lim; i++)
    36. {
    37. os << ArrayDb::operator[](i) << " ";
    38. if (i % 5 == 4)
    39. os << endl;
    40. }
    41. if (i % 5 != 0)
    42. os << endl;
    43. }
    44. else
    45. os << "empty array ";
    46. return os;
    47. }
    48. //friends
    49. //use string version of operator>>()
    50. istream& operator >>(istream& is, Student& stu)
    51. {
    52. is >> (string &)stu;
    53. return is;
    54. }
    55. //use string friend getline(istream &,const string &)
    56. istream& getline(istream& is, Student& stu)
    57. {
    58. getline(is, (string&)stu);
    59. return is;
    60. }
    61. //use string version of operator <<()
    62. ostream& operator<<(ostream& os, const Student& stu)
    63. {
    64. os << "Scores for " << (const string&)stu << ":\n";
    65. stu.arr_out(os);
    66. return os;
    67. }

    use_stui.cpp (和上一个博文:包含是一样的,具体的略)

    结果(和上一个博文:包含是一样的,具体的略)

    使用包含还是使用继承?

    包含和私有继承都可以用来表示has-a的关系,那么该怎么选择呢?大多数程序员选择包含(也就是公有继承)。

    首先:它利于理解,

    其次:继承会引起很多问题

    另外:可以使用包含来声明多个独立的string 成员,而继承则只能使用一个这样的对象。

    私有继承的优势情况是:

    首先:它提供的特性比较多,如果类包含保护成员,那么派生类可以使用这些保护成员

    其次:需要重新定义虚函数。派生类可以重新定义虚函数,但是包含却不可以。

  • 相关阅读:
    在中国,为中国——西门子低代码精准助力本土企业数字化探索之路
    C++入门基础知识(2)
    计算机毕业设计ssm基于JAVA的食品类购物系统q645b系统+程序+源码+lw+远程部署
    platform驱动框架梳理
    【Java基础面试十】、何对Integer和Double类型判断相等?
    geemap学习笔记011:可视化遥感影像随时间的变化
    2020年数维杯数学建模A题舆情监测情感倾向分析建模求解全过程文档及程序
    mac为什么不支持ntfs,mac读取ntfs移动硬盘软件有哪些
    你真的了解CPU和GPU?
    某60区块链安全之51%攻击实战学习记录
  • 原文地址:https://blog.csdn.net/superfreak/article/details/126660666