继承和派生

class Student:public Person

派生类把基类全部的成员(不包括构造函数和解析函数)继承下来

公有继承

基类成员继承给派生类后,其访问权限不变,但基类成员的私有成员在派生类中不可以直接访问

私有继承

基类中的所有成员都以私有成员身份出现在派生类中,基类的私有成员在派生类中不可直接访问

保护成员和保护继承

从用户的角度来看,保护成员等价于私有成员,但是有一点不同,保护成员可以被派生类的成员函数使用

在保护继承中,基类的公有和保护成员都以保护成员的身份出现在派生类中,而基类的私有成员不可以直接访问

派生类的构造函数

class Person
{
public:Person(){id = 1;name = "";sex = 'L';}Person(int id,string name,char sex){this->id = id;this->name = name;this->sex = sex;}
private:int id;string name;char sex;
};class Student:public Person
{   // 在派生类构造函数的形参列表中,要给出初始化基类和派生类的数据成员所需要的全部参数  Student(int id,string name,char sex,float score):Person(id,name,sex){this->score = score;}
privatefloat score;
};

当创建一个派生类的对象时,系统首先自动调用基类构造函数,再调用派生类的构造函数。

如果一个类只作为基类使用,一般不会用于实例化对象,就会把这个基数的数据成员和构造函数设置为protected访问权限,这样既保证了数据的封装性,又能在派生类中访问,保证了数据的一致性。

派生类的析构函数

先执行派生类的析构函数,然后调用基类的析构函数。

多继承

#include<iostream>
using namespace std;
class A
{
public:A(int x){this->x = x;}
private:int x;};
class B
{
public:B(int y){this->y = y;}
private:int y;
};class C:public A,public B
{
public:C(int x,int y,int z):A(x),B(y){this->z = z;}
private:int z;}

同名函数的屏蔽:

如果派生类和基类的函数同名,但是参数不同,此时,无论有没有virtual关键字,基类函数被隐藏。

如果函数同名,参数相同,并且无virtual关键字,基类函数被隐藏。(注意和函数重写的区别)

采用:“对象名.基类名::成员名”唯一访问函数

多继承的时候可能会产生二义性问题。c++提供虚基类的方法,当基类通过多个路径被一个派生类继承时,该派生类只继承该基类一次。

class A:virtual public M

类的组合

继承时纵向的,组合是横向的。

#include<iostream>
using namespace std;
class Point
{public:Point():x(0),y(0){cout<<"Point's default constructor was called"<<endl;}Point(double x,double y):x(x),y(y){cout<<"Point's constructor was called"<<endl;}Point(Point &p){x = p.x;y = p.y;cout<<"Point's copyConstructor was called"<<endl;}
private:double x;double y;
};class Line
{
public:Line():A(),B(){}Line(double x1,double y1,double x2,double y2):A(x1,y1),B(x2,y2){}Line(Point p1,Point p2):A(p1),B(p2){}
Private:Point A;Point B;
};

基类和派生类的转换

不能把一个整形数据赋值给指针变量

可以用派生类对象对基类对象进行赋值,并且具有赋值兼容性(公有继承)

多态性与虚函数

虚函数

满足的条件:

  • 基类与子类之间为公有继承方式
  • 基类函数要声明为虚函数
  • 通过基类指针或者引用来调用函数
class A
{
public:virtual void display{}
};
class B:public A
{
public:void display{}
}void main()
{A *pa;B ba;pa = &ba;pa->display();// 虽然pa是A类的对象,但是执行的是B类的display()
}

在运行过程中,根据基类指针指向不同的派生类对象就可以访问响应对象的虚函数,从而实现了运行时的动态多态性。派生类的虚函数重写或者覆盖了基类的同名虚函数。

注意

  • virtual关键字只能出现在虚函数的原型声明中,在虚函数的实现中不能出现。
  • 将基类中的某一个成员声明为虚函数后,派生类中的同名函数(函数名相同,参数列表完全一样,返回值类型相同)自动成为虚函数。
  • 如果声明了某个成员函数为虚函数,则在该类中不能出现同名函数(函数名相同,参数列表完全一样,返回值类型相同),在以该类为基类的派生类中,也不能出现同名函数。
  • 非类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数不能定义为虚函数,当可以将析构函数定义为虚函数。
  • 声明虚函数的时候,必须实现函数体。
  • 当通过基类指针删除指向子类的动态对象时,子类的析构函数没有被执行,说明子类对象动态分配的空间没有得到释放,造成了内存泄露。为解决这个问题,常常将基类的析构函数定义为虚函数。

纯虚函数

virtual void Area(); //错误,必须在基类中实现
virtual void Area()
{
}
//正确
virtual void Area() = 0;
//纯虚函数

抽象类

不用实例化对象,只作为一种“模板”用于派生的类,成为抽象类。

运算符重载

A operate+ (A &a1,A &a2)
{int x = a1.x + a2.x;A a(x);return a;}
//定义一种新的加法算法

一般来说,重载函数中要用到一些private的变量,所以一般把重载函数定义为友元函数。

friend A operate+ (A &a1,A &a2);

有两个实例!!

C++继承和派生笔记相关推荐

  1. 【学习笔记】C++语言程序设计(郑莉):继承与派生

    [学习笔记]C++语言程序设计(郑莉):继承与派生 1. 类的继承与派生 1.1 派生类的定义 1.2 派生类生成过程 2. 访问控制 3. 类型兼容规则 4. 派生类的构造和析构函数 4.1 构造函 ...

  2. C++复习笔记--继承和派生

    -继承和派生 一继承(继承就是从先辈处得到属性和行为特征) 1 派生类的声明 class  派生类名∶[继承方式] 基类名 { 派生类新增的数据成员和成员函数 }: 2 基类成员在派生类中的访问属性 ...

  3. 程序设计与算法三~C++面向对象程序设计~北大郭炜MOOC学习笔记~第五章:继承与派生(新标准C++程序设计)

    以下内容为笔者手打,望读者珍惜,如有转载还请注明. 第五章 继承与派生 $5.1 继承与派生的概念 $5.1.1 基本概念     在C++中,当定义一个新的类B时,如果发现类B拥有某个已经写好的类A ...

  4. C++(22)--继承和派生

    继承和派生 1.基本概念 2.实现公有继承 3.私有继承的例子 4. 继承和组合 <老九学堂C++课程><C++ primer>学习笔记.<老九学堂C++课程>详情 ...

  5. python基础——继承与派生、组合

    python基础--继承与派生 1 什么是继承: 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类成为基类或超累,新建的类成为派生类或子类 1.1 继承分为:单 ...

  6. Python基础20-面向对象:静态、组合、继承与派生、多态、封装、反射、内置attr方法等

    目录 静态 静态属性@property 类方法@classmethod 静态方法@staticmethod 组合 继承与派生 继承与派生 继承顺序 在子类中调用父类方法与super 多态 封装 反射 ...

  7. Python之面向对象继承和派生

    Python之面向对象继承和派生 什么是继承: 继承是一种创建新的类的方法.在Python中,新建的类可以继承自一个或多个父类.原始类称为基类或超类. 新建的类称为派生类或子类. Python中类的继 ...

  8. C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中

    C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中 测试2:证明派生类的虚函数的地址跟第一基类的虚函数地址保存在同一张虚函数表中. 派生类有多少个拥有虚函数的基类,派生类对象就有多少 ...

  9. JAVA 继承和派生4.1-4.3 2020.3.20

    ** tips 11:08:49 纪明宇老师 13936001804 11:25:04 大家要注意理解: 子类是一种父类 子类对象也是一种父类型的对象 还有间接父类 4.1.1继承的概念 两个类,有些 ...

最新文章

  1. eclipse ldt update resource
  2. HDU1812 - Count the Tetris
  3. matlab求任意点最短路径,【最短路】求两点间最短路径的改进的Dijkstra算法及其matlab实现...
  4. Jsp 购物车(oracle数据库)之初级版
  5. 【深入理解Java原理】ThreadLocal
  6. 倍福---Modbus TCP Server和调试助手测试
  7. Java培训机构可靠吗?
  8. 2018厦门大学计算机技术分数线,2018厦门大学专业排名及分数线 王牌专业有哪些...
  9. OPC Expert 最新版Crack
  10. composer 初级使用
  11. 文墨绘学书法教育领导品牌
  12. 将淘宝爬取的数据写入Excel表格
  13. 这篇 python 文章,是过去你错过的 python 细节知识点,滚雪球第4季第15篇
  14. 树形dp瞎讲+树形dp基础题题解
  15. 淘宝数据库OceanBase SQL编译器部分 源码阅读--解析SQL语法树
  16. 中国是时候在东亚做老大了?
  17. 关于「付费合集」的说明
  18. 泰拳的快感之二——我看《冬荫功》
  19. ADD failed: file not found in build context or excluded by .dockerignore: stat
  20. 学术会议参会经验分享上(参会前的准备工作)

热门文章

  1. Microsoft Visual Studio 2010 Service Pack 1 离线下载版
  2. EEPROM, NAND FLASH, NOR FLASH
  3. 康托展开与逆康托展开详解
  4. 常用ftp服务器资源
  5. 动态SQL与SQL注入(一)动态SQL
  6. 利用vs将cs文件编译成dll文件
  7. JDBC连接数据库步骤(入门到进阶全)
  8. PDCAOODA循环
  9. numpy计算移动平均值
  10. JavaWeb开发框架