c++入门---------继承篇

简介: 笔记

学完c++面向对象基础后,紧随其后的便是继承了,可想而知继承的重要性!

一. 什么是继承

1.对于刚刚学完面向对象编程基础的朋友,看到这里的第一个问题就是什么是继承,这个可以直接从字面意思上理解,你可以继承其他人的财产,只要别人同意,同样对象也可以继承另一个对象的函数与变量。

2.在继承中,被继承的类称为基类或者父类,继承该类的类称为子类或者派生类。

3.继承可以最大限度的实现代码的复用。

4.下面给出继承的简单实例。

#include<iostream>
using namespace std;
class A{
private:
  int x;
  int y;
public:
  A(int a,int b)
  {
    x = a;
    b = b;
  };
  void disp()
  {
    cout<<x,y<<endl;
  }
};
class B:public A    #类B继承类A
{
private:
  int z;
public:
  B(int a,int b, int c):A(a,b),z=c; 
};
int main()
{
  B a(1,2,3);
  a.disp();   #类B可以调用类A的函数。
  return ;
}

在上述代码中,我们定义了类A和类B,类B继承类A,既类A称为父类或者基类,类B称为子类或者派生类。


二. 基类和派生类

1.基类


1.直接基类:B继承A,则A为B的直接基类。

2.间接基类:C继承B,B继承A,则A为C的间接基类。


2.public和private派生


1.在两种派生方法当中,主要的区别就是基类对象在派生类中是私有的还是公开的,下面这个表格中归纳了一下。

15.png

可见无论采用那种方法基类的private成员在派生类中和外部都是不可见的,而public成员在private派生方法中,在派生类中是private的,public中的派生类中是public的。

3. protected派生

在上面的派生中,如果派生类在往下派生一类的话,那么基类的变量便会不可以访问了,为了解决这个问题,由此产生了protected派生。

16.png

三. 多基派生

  1. 一个类继承其他的多个类称为多基派生。其声明和定义为
派生类名(参数表):基类名1(参数),基类名2(参数),.....,基类名n(参数n)
{
private:
public:
};

2.在多派生中会存在一个二义性问题,下面通过代码来说明。

#include<iostream>
using namespace std;
class A{
  public:
    void print(){
    cout<<"hello c++"<<endl;
    }
};
class B{
  public:
    void print(){
    count<<"hello,c"<<endl;
    }
};
class C:public A,public B
{
  public:
    void disp()
    {
    print();
    }
};
int main()
{
  C a;
  a.disp();
  a.print();
  return 0;
}

在上述代码中,类A和类B中都有print函数,类C继承了A,B,在调用print函数的时候,编译器就不知道是那个类中的print函数,这样就出现了二义性。这个问题可以通过成员限定符来消除二义性。

a.A::print();

四. 虚基类

1.虚基类又是为了解决什么问题呢?这里四个类A,B,C,D,假如说,类B继承类A,类C也继承类A,类D继承类B和类C,这里便会出现一个问题,在类D中,会有两个类A的复制。

2.这样也会带来二义性。例如说,在类D中要调用类A中的函数,那会会出现是通过类B再到类A,还是通过类C再到类B呢?这便产生了二义性。

3.我们可以通过声明虚基类来消除类A在内存的双重复制,虚基类的定义为:

class 派生类名:virtual 派生方式 基类名
{
};

在回到上面的问题中,这时候如果我们类B继承的是虚基类A,类C继承的虚基类A,类D继承类B和类C,那么便不会出现内存中出现两个类A了,从而取消了二义性。

五. 派生类的构造函数和析构函数

派生时,由于构造函数和析构函数是不能被继承的,所以对派生类我们需要重新定义。在创建派生类对象时,系统首先通过派生类的析构函数来调用基类的构造函数,完成基类成员的初始化,而后对派生类中新增的成员进行初始化。


1.派生类构造函数的一般格式为

派生类名 (派生类构造函数参数列表): 基类构造函数(基类构造函数参数列表){};


2.必须将基类的构造函数放在派生类的初始化表达式中,一调用基类构造函数完成基类数据成员的初始化,派生类构造函数实现的功能如下:

  1.完成对象所占整块内存的开辟,由系统在构造函数时自动完成。

  2.调用基类的构造函数完成基类成员的初始化。

  3.若派生类中含对象成员、const成员或引用成员,则必须在初始化表中初始化。

  4.派生类构造函数体执行。


3.派生类的析构函数

  1.在对象被删除的时候,自动调用析构函数,其调顺序为先派生类,后基类。

Thank for your reading!


公众号:FPGA之旅


目录
相关文章
|
6天前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
37 16
|
2天前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
20 5
|
2月前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
38 1
【C++】继承
|
3月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
57 2
C++入门12——详解多态1
|
3月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
69 1
|
3月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
94 1
|
3月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
53 1
|
3月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
36 0
|
3月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
40 0
|
3月前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
25 0