• C++ 继承详解


    目录

    C++ 继承介绍

    继承中的特点

    public 继承

    protected 继承

    private 继承

    在类里面不写是什么类型,默认是 private 的

    如果继承时不显示声明是 private,protected,public 继承,则默认是 private 继承,在 struct 中默认 public 继承:

    总结一下三种继承方式:

    多继承

    多继承(环状继承)


    C++ 继承介绍

    面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。

    当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类

    继承中的特点

    有public, protected, private三种继承方式,它们相应地改变了基类成员的访问属性。

    • 1.public 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:public, protected, private

    • 2.protected 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:protected, protected, private

    • 3.private 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:private, private, private

    但无论哪种继承方式,上面两点都没有改变:

    • 1.private 成员只能被本类成员(类内)和友元访问,不能被派生类访问;

    • 2.protected 成员可以被派生类访问。

    public 继承

    1. #include
    2. #include
    3. using namespace std;
    4. class A{
    5. public:
    6. int a;
    7. A(){
    8. a1 = 1;
    9. a2 = 2;
    10. a3 = 3;
    11. a = 4;
    12. }
    13. void fun(){
    14. cout << a << endl; //正确
    15. cout << a1 << endl; //正确
    16. cout << a2 << endl; //正确
    17. cout << a3 << endl; //正确
    18. }
    19. public:
    20. int a1;
    21. protected:
    22. int a2;
    23. private:
    24. int a3;
    25. };
    26. class B : public A{
    27. public:
    28. int a;
    29. B(int i){
    30. A();
    31. a = i;
    32. }
    33. void fun(){
    34. cout << a << endl; //正确,public成员
    35. cout << a1 << endl; //正确,基类的public成员,在派生类中仍是public成员。
    36. cout << a2 << endl; //正确,基类的protected成员,在派生类中仍是protected可以被派生类访问。
    37. cout << a3 << endl; //错误,基类的private成员不能被派生类访问。
    38. }
    39. };
    40. int main(){
    41. B b(10);
    42. cout << b.a << endl;
    43. cout << b.a1 << endl; //正确
    44. cout << b.a2 << endl; //错误,类外不能访问protected成员
    45. cout << b.a3 << endl; //错误,类外不能访问private成员
    46. system("pause");
    47. return 0;
    48. }

    protected 继承

    1. #include
    2. #include
    3. using namespace std;
    4. class A{
    5. public:
    6. int a;
    7. A(){
    8. a1 = 1;
    9. a2 = 2;
    10. a3 = 3;
    11. a = 4;
    12. }
    13. void fun(){
    14. cout << a << endl; //正确
    15. cout << a1 << endl; //正确
    16. cout << a2 << endl; //正确
    17. cout << a3 << endl; //正确
    18. }
    19. public:
    20. int a1;
    21. protected:
    22. int a2;
    23. private:
    24. int a3;
    25. };
    26. class B : protected A{
    27. public:
    28. int a;
    29. B(int i){
    30. A();
    31. a = i;
    32. }
    33. void fun(){
    34. cout << a << endl; //正确,public成员。
    35. cout << a1 << endl; //正确,基类的public成员,在派生类中变成了protected,可以被派生类访问。
    36. cout << a2 << endl; //正确,基类的protected成员,在派生类中还是protected,可以被派生类访问。
    37. cout << a3 << endl; //错误,基类的private成员不能被派生类访问。
    38. }
    39. };
    40. int main(){
    41. B b(10);
    42. cout << b.a << endl; //正确。public成员
    43. cout << b.a1 << endl; //错误,protected成员不能在类外访问。
    44. cout << b.a2 << endl; //错误,protected成员不能在类外访问。
    45. cout << b.a3 << endl; //错误,private成员不能在类外访问。
    46. system("pause");
    47. return 0;
    48. }

    private 继承

    1. #include
    2. #include
    3. using namespace std;
    4. class A{
    5. public:
    6. int a;
    7. A(){
    8. a1 = 1;
    9. a2 = 2;
    10. a3 = 3;
    11. a = 4;
    12. }
    13. void fun(){
    14. cout << a << endl; //正确
    15. cout << a1 << endl; //正确
    16. cout << a2 << endl; //正确
    17. cout << a3 << endl; //正确
    18. }
    19. public:
    20. int a1;
    21. protected:
    22. int a2;
    23. private:
    24. int a3;
    25. };
    26. class B : private A{
    27. public:
    28. int a;
    29. B(int i){
    30. A();
    31. a = i;
    32. }
    33. void fun(){
    34. cout << a << endl; //正确,public成员。
    35. cout << a1 << endl; //正确,基类public成员,在派生类中变成了private,可以被派生类访问。
    36. cout << a2 << endl; //正确,基类的protected成员,在派生类中变成了private,可以被派生类访问。
    37. cout << a3 << endl; //错误,基类的private成员不能被派生类访问。
    38. }
    39. };
    40. int main(){
    41. B b(10);
    42. cout << b.a << endl; //正确。public成员
    43. cout << b.a1 << endl; //错误,private成员不能在类外访问。
    44. cout << b.a2 << endl; //错误, private成员不能在类外访问。
    45. cout << b.a3 << endl; //错误,private成员不能在类外访问。
    46. system("pause");
    47. return 0;
    48. }

    在类里面不写是什么类型,默认是 private 的

    1. include
    2. using namespace std;
    3. class Line{
    4. int a;
    5. };
    6. int main() {
    7. Line line;
    8. line.a = 5;
    9. cout<
    10. }

    上面是会报错的,应该改成:

    1. class Line{
    2. public:
    3. int a;
    4. };

    如果继承时不显示声明是 private,protected,public 继承,则默认是 private 继承,在 struct 中默认 public 继承

    1. class B : A {};
    2. B b;
    3. b.a; //错误
    4. b.a1; //错误
    5. b.a2; //错误
    6. b.a3; //错误

    总结一下三种继承方式:

    继承方式基类的public成员基类的protected成员基类的private成员继承引起的访问控制关系变化概括
    public继承仍为public成员仍为protected成员不可见基类的非私有成员在子类的访问属性不变
    protected继承变为protected成员变为protected成员不可见基类的非私有成员都为子类的保护成员
    private继承变为private成员变为private成员不可见基类中的非私有成员都称为子类的私有成员

    多继承

    多继承即一个子类可以有多个父类,它继承了多个父类的特性。

    C++ 类可以从多个类继承成员

    其中,访问修饰符继承方式是 public、protected 或 private 其中的一个,用来修饰每个基类,各个基类之间用逗号分隔

    示例:

    1. #include
    2. using namespace std;
    3. // 基类 Shape
    4. class Shape
    5. {
    6. public:
    7. void setWidth(int w)
    8. {
    9. width = w;
    10. }
    11. void setHeight(int h)
    12. {
    13. height = h;
    14. }
    15. protected:
    16. int width;
    17. int height;
    18. };
    19. // 基类 PaintCost
    20. class PaintCost
    21. {
    22. public:
    23. int getCost(int area)
    24. {
    25. return area * 70;
    26. }
    27. };
    28. // 派生类
    29. class Rectangle: public Shape, public PaintCost
    30. {
    31. public:
    32. int getArea()
    33. {
    34. return (width * height);
    35. }
    36. };
    37. int main(void)
    38. {
    39. Rectangle Rect;
    40. int area;
    41. Rect.setWidth(5);
    42. Rect.setHeight(7);
    43. area = Rect.getArea();
    44. // 输出对象的面积
    45. cout << "Total area: " << Rect.getArea() << endl;
    46. // 输出总花费
    47. cout << "Total paint cost: $" << Rect.getCost(area) << endl;
    48. return 0;
    49. }

    编译结果:

    1. Total area: 35
    2. Total paint cost: $2450

    多继承(环状继承)

    多继承(环状继承),A->D, B->D, C->(A,B),例如:

    1. class D{......};
    2. class B: public D{......};
    3. class A: public D{......};
    4. class C: public B, public A{.....};

    这个继承会使D创建两个对象,要解决上面问题就要用虚拟继承格式

    格式:class 类名: virtual 继承方式 父类名

    1. class D{......};
    2. class B: virtual public D{......};
    3. class A: virtual public D{......};
    4. class C: public B, public A{.....};

    虚继承--(在创建对象的时候会创建一个虚表)在创建父类对象的时候

    1. A:virtual public D
    2. B:virtual public D

    示例:

    1. #include
    2. using namespace std;
    3. //基类
    4. class D
    5. {
    6. public:
    7. D(){cout<<"D()"<
    8. ~D(){cout<<"~D()"<
    9. protected:
    10. int d;
    11. };
    12. class B:virtual public D
    13. {
    14. public:
    15. B(){cout<<"B()"<
    16. ~B(){cout<<"~B()"<
    17. protected:
    18. int b;
    19. };
    20. class A:virtual public D
    21. {
    22. public:
    23. A(){cout<<"A()"<
    24. ~A(){cout<<"~A()"<
    25. protected:
    26. int a;
    27. };
    28. class C:public B, public A
    29. {
    30. public:
    31. C(){cout<<"C()"<
    32. ~C(){cout<<"~C()"<
    33. protected:
    34. int c;
    35. };
    36. int main()
    37. {
    38. cout << "Hello World!" << endl;
    39. C c; //D, B, A ,C
    40. cout<<sizeof(c)<
    41. return 0;
    42. }

    编译结果:

  • 相关阅读:
    CTF-sql注入(X-Forwarded-For)【简单易懂】
    【王道计算机组成原理】第三章 存储系统
    Windows 图像处理组件(WIC)读写位深度24位的 bmp 文件
    Python BeautifulSoup4 入门使用
    JavaScript -- 多种类型转换方法总结
    【redis-01】redis整合springboot实现简单的增删改查
    如何防止服务器网站被黑
    好消息!北京、珠海PMP考试时间来啦
    2024绿色能源、城市规划与环境国际会议(ICGESCE 2024)
    浏览器绑定快捷键KeyboardEvent
  • 原文地址:https://blog.csdn.net/m0_74712453/article/details/133078926