c++远征之继承篇
来源:互联网 发布:vb控制plc 编辑:程序博客网 时间:2024/04/29 01:28
1.什么是继承
当创建对象时,是先调用父类的构造函数还是子类的构造函数呢?
当销毁对象时,是先调用父类的析构函数还是子类的析构函数呢?
下面一段代码揭晓:
/*Person.h*/#include<string>using namespace std;class Person{public:Person();~Person();void eat();string m_strName;int m_iAge;};
/*Person.cpp*/#include<iostream>#include"Person.h"using namespace std;Person::Person(){cout << "Person() "<< endl;}Person::~Person(){cout << "~Person() "<< endl;}void Person::eat(){cout << "eat() "<< endl;}
/*Worker.h*/#include"Person.h"class Worker:public Person{public:Worker();~Worker();void work();int m_iSalary;};
/*Worker.cpp*/#include<iostream>#include"Worker.h"using namespace std;Worker::Worker(){cout << "Worker() " << endl;}Worker::~Worker(){cout << "~Worker() " << endl;}void Worker::work(){cout << "work() " << endl;}
/*demo.cpp*/#include<iostream>#include<stdlib.h>#include"Worker.h"using namespace std;int main(void){Worker *p=new Worker();delete p;p = NULL;system("pause");return 0;}
打印结果:
很显然:在创建对象时是先调用父类的构造函数然后再调用子类的构造函数,而在销毁对象时,是先调用子类的析构函数再调用父类的析构函数。两者过程正好。
2.继承方式
2.1 公有继承(public)
2.2 保护继承(protected)
2.3 私有继承(private)
/******************************************************************************************************/
保护继承和私有继承
要求:1.Person类,数据成员:m_strName,成员函数:构造函数、play()
2.soldier类,数据成员:m_iAge,成员函数:构造函数、work()
3.Infantry步兵类,成员函数:attack()
/*******************************************************************************************************/
代码展示:
/*Person.h*/#include<string>using namespace std;class Person{public:Person();void play();protected:string m_strName;};
/*Person.cpp*/#include<iostream>#include"Person.h"using namespace std;Person::Person(){m_strName = "Merry";}void Person::play(){cout << "Person----play() "<< endl;cout << m_strName << endl;}
/*士兵类*/#include"Person.h"class Soldier:protected Person{public:Soldier();void work();protected:int m_iAge;private:};
#include<iostream>#include"Soldier.h"using namespace std;Soldier::Soldier(){}void Soldier::work(){m_strName = "Jim";m_iAge = 20;cout << m_strName << endl;cout << m_iAge << endl;cout << "Soldier---work()" << endl;}
/*步兵类*/#include"Soldier.h"class Infantry:private Soldier{public:void attack();};
#include<iostream>#include"Infantry.h"using namespace std;void Infantry::attack(){m_strName = "Jim";cout << m_strName << endl;cout << "Infantry--attack()" << endl;}
运行结果:
Soldier 保护继承 Person
Infantry 保护继承 Soldier
最后通过Infantry的成员函数访问到了Person的保护成员
3.继承中的特殊关系----隐藏
什么情况下会发生隐藏: 父子关系->函数同名->隐藏
在这种情况下,当调用ABC()这个函数时,其实是调用子类中的函数,而隐藏了父类的同名函数,如果要调用父类的成员函数,就要写成父类名称::ABC()。
- c++远征之继承篇
- c++远征之继承篇
- c++远征之继承篇——继承方式
- c++远征之继承篇——多重继承,多继承,虚继承,多继承时的重复定义解决方法
- c++远征之启航篇
- c++远征之继承篇——继承的概念、继承时构造函数/析构函数的先后顺序
- c++远征之继承篇——隐藏,isa,虚析构函数
- C++远征之起航篇知识点
- C++远征之封装篇上
- C++远征之封装篇下
- C++远征之友元函数篇<->
- c++远征之封装篇(对象)
- c++远征之离港篇
- c++远征之封装篇(拷贝构造函数)
- c++远征之封装篇(对象指针)
- c++远征之封装篇(this指针)
- C++远征之封装篇——字符串类型
- c++远征之模板篇——运算符重载
- CCCC上几道树的题目
- 2016最新PHP燕十八系统实战入门网站视频教程
- codevs 1005 计算器的改良
- ZJOI2017 NGU!
- win7系统
- c++远征之继承篇
- 通过 xshell 连接 ubuntu on windows(WSL)
- 23种设计模式分析(5):行为型模式
- LeetCode 94. Binary Tree Inorder Traversal
- 2017年3月24日,周结(五),学生信息管理系统继续改进以及一些框架的使用
- 让UIWebView实现UIScrollerView的代理方法
- UE4 BP爬坑手记1
- 火狐浏览器打开时会自动打开毒霸网址大全
- 虚拟机(Linux)和物理机实现文件共享