继承

继承允许我们一句另一个类来定义一个类,这使得继承和维护一个程序变得更加容易,也达到了重用代码功能和提高执行效率的效果。

一般格式为:

class 派生类名 :访问修饰符 基类名{};

其中访问修饰符是public protected private中的一个,默认为private

派生类可以访问基类中所有的非私有成员,因此基类成员如果不想被派生类的成员访问,则应该在基类声明为private

一个派生类继承了所有的基类非私有方法,但是下列情况除外:

  • 基类的构造函数,析构函数和拷贝构造函数
  • 基类的重载运算符
  • 基类的友元函数

继承类型

  • 公有继承:基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护乘员胡安,基类的私有成员不能直接被派生类访问,但是可以通过基类的公有和保护方法来访问。
  • 保护继承:基类的公有和保护成员将成为派生类的保护成员
  • 私有继承:公有和保护成员将称为派生类的私有成员

多继承

一个子类可以有多个父类,继承了多个父类的特性,不同父类用逗号隔开。

class <派生类名>:<继承方式><基类名>,<继承方式>,<基类名><继承方式><基类名>,..
{};

虚继承

因为C++多继承的特性,当从两个方向继承到同一个类的时候就可能会出现拷贝了两份相同数据的问题,这个时候访问被拷贝多份的数据成员如果没有加名字空间编译器就会报错,因为不确定到底访问的是哪一份变量。为了解决这个问题,我们要使用虚继承从而实现只拷贝一份变量。需要注意的一点是,虚继承是指对多个类继承一个类的时候需要进行虚继承,这样就能解决一个类继承这多个类的时候出现的成员重复。

具体见样例:

class A{};
class B:virtual public A{};
class C:virtual public A{};
class D:public B,public C{};//注意对D来讲用virtual已经晚了,我们在上面个多个类继承A的时候用虚继承,这样有其他类继承B,C等的时候就不会出现问题。

继承机理

编译器先通过基类的构造函数创建一个基类的对象,然后再通过派生类的构造函数在后面加上派生类的成员,并进行初始化。基类中私有成员对派生类不可见,但是派生类对象可以通过父类提供的接口对父类中的对象进行访问。实际上派生类成员是含有基类中的所有的成员的。

对于相同名字的数据成员,通过基类方法改变的是基类的数据成员,通过派生类方法改变的是派生类数据成员。如果想要访问基类的(公有)成员可以使用名字空间。

可以由以下测试看出:


#include<iostream>
#include<cstdio>using namespace std;class A
{int a[100];
public:int b;
};
class B :public A
{//int c[50];int d;
};int main()
{B a;printf("%d", sizeof(a));return 0;
}

运行结果:

显然派生类中含有基类的私有成员,只是不可以直接访问。

派生类的构造函数

详见另一篇文章:构造函数,作者讲的很好。

在每次派生类构造函数调用时,首先会调用父类的构造函数,然后再调用派生类的构造函数,最后先调用派生类的析构函数,最后调用父类的析构函数。

在每个派生类构造函数中,如果我们要使用父类的有参构造函数,则需要在函数头部调用。如果我们没有显式地调用父类的构造函数则编译器会自动在派生类构造函数开头调用基类的无参构造函数。(如果基类只有有参构造函数编译器会因为找不到无参构造函数而报错)。

显式调用的格式如下:

class A
{public:A(int x){}
};
class B:public A
{public:
B():A(x)//只可以在这一个地方显式调用
{}
};

在其他地方显式调用都是没有意义的。(相当于创建了一个没有办法引用的父类)
见下例:


#include<iostream>
#include<cstdio>using namespace std;class A
{int a[100];
public:A(){printf("调用了无参构造函数\n");}~A(){printf("调用了析构函数\n");}A(int x){printf("调用了有参构造函数\n");a[0] = x;}int b;
};
class B :public A
{//int c[50];int d;
public:B(){A(5);printf("test\n");d = 0;}void Print(){printf("Hello world!\n");}
};int main()
{B* a=new B();printf("%d\n", sizeof(a));a->Print();delete a;return 0;
}

运行结果:

【C++学习笔记二】C++继承相关推荐

  1. 【Java学习笔记二】继承和多态

    与C++不同的是,在Java中,一个类只能直接继承另一个类,而不允许继承多个类,这个新类称为继承类.派生类或者子类,而被继承的类称为基类或者父类. 继承类能够继承基类的群不属性和行为. 面向对象程序设 ...

  2. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  3. PyTorch学习笔记(二)——回归

    PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...

  4. python编程语言继承_python应用:学习笔记(Python继承)

    学习笔记(Python继承)Python是一种解释型脚本语言,可以应用于以下领域: web 和 Internet开发 科学计算和统计 人工智能 教育 桌面界面开发 后端开发 网络爬虫 有几种叫法(父类 ...

  5. python学习笔记(二) 基本运算

    python学习笔记(二) 基本运算 1. 条件运算 基本语法 if condition1: do somethings1elif condition2: do somethings2else: do ...

  6. css中怎么加入立体模型,CSS学习笔记二:css 画立体图形

    继上一次学了如何去运用css画平面图形,这一次学如何去画正方体,从2D向着3D学习,虽然有点满,但总是一个过程,一点一点积累,然后记录起来. Transfrom3D 在这一次中运用到了一下几种属性: ...

  7. [转载]dorado学习笔记(二)

    原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...

  8. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

  9. Scapy学习笔记二

    Scapy学习笔记二 Scapy Sniffer的用法: http://blog.csdn.net/qwertyupoiuytr/article/details/54670489 Scapy Snif ...

  10. Ethernet/IP 学习笔记二

    Ethernet/IP 学习笔记二 原文链接:http://wiki.mbalib.com/wiki/Ethernet/IP 1.通信模式 不同于源/目的通信模式,EtherNet/IP 采用生产/消 ...

最新文章

  1. Windows下搭建PHP开发环境
  2. 用 Python 画圣诞树的 N 种玩法
  3. 《LeetCode力扣练习》第160题 相交链表 Java
  4. HTML(格式,文本标签)
  5. 2021东营市地区高考成绩排名查询,东营高中学校实力排名,2021年东营所有的高中分数线排名...
  6. webpack流程图
  7. Python之每个人都应该知道的30个一行代码程序
  8. netbeans 源文件_具有NetBeans,嵌入式GlassFish,JPA和MySQL数据源的Arquillian
  9. 第十周 11.1-11.7
  10. jxl操作excel样式设置
  11. 由摄像机的内参K计算视景体——glFrustum的参数推导
  12. java 双向链表_数据结构-链表、栈和队列
  13. gentoo AR9285 BCM57780 安装驱动
  14. smartadmin官网_smartadmin api_smartadmin 下载
  15. Sentaurus TCAD学习
  16. RS-422接口定义
  17. Eclipse 绿豆沙
  18. 5大输入法突然下架!得知真相的网友懵了:我都用了10年了……
  19. linux ipsec racoon工具移动客户端模式详细配置
  20. java俄罗斯方块七中图形类_用shell写俄罗斯方块

热门文章

  1. apscheduler -定时任务
  2. Asp.net MVC 4新项目中创建area的后续操作
  3. asp.net mvc 如何在View中获取Url参数的值
  4. Delphi 一些函数解释
  5. DevExpress GridControl 后台设置列
  6. 在需要时开启Perl新特性
  7. [windows phone 7 ]查看已安装程序GUID
  8. 第一次连接mysql失败_MySQL 远程连接失败
  9. js中双感叹号_JavaScript中双叹号(!!)作用
  10. mongo数据库和mysql数据库的区别_Mongodb与mysql数据库的区别