C++之继承
来源:互联网 发布:软件测试工程师学习 编辑:程序博客网 时间:2024/06/05 01:03
1)为什么要继承
实现代码复用。
在实例化一个派生类对象时,先调用基类构造函数,在调用派生类构造函数;
销毁派生类对象时,析构函数调用顺序正好相反
#include<iostream>#include<string>using namespace std;class Person{public: Person(){ cout << "Person()" << endl; } ~Person(){ cout << "~Person()" << endl; } void eat(){ cout << "eat()" << endl; } string m_strName; int m_iAge;};class Worker :public Person{public: Worker(){ cout << "Worker()" << endl; } ~Worker(){ cout << "~Worker()" << endl; } void worker(){ cout << "worker()" << endl; } int m_iSalary;};int main(){ Worker *pWorker = new Worker(); delete pWorker; pWorker = NULL; return 0;}
2)继承方式
a.公有继承
class A:public B
基类 public protected private派生类 public protected 无法访问
b)保护继承
class A:protected B
基类 public protected private派生类 protected protected 无法访问
c)私有继承
cladd A:private B
基类 public protected private派生类 private private 无法访问
3)隐藏和覆盖
父类 void f();
子类 void f();
当实例化子类对象时,只能访问子类的f();隐藏了父类的f();
总结:父子关系 成员同名 隐藏
覆盖是指派生类函数覆盖基类函数,特征是:
不同的范围(分别位于派生类与基类);
函数名字相同;
参数相同;
基类函数必须有virtual关键字。
4)Is_a关系
eg:人类是基类,派生类为士兵和工人,士兵和工人都是人类。
派生类对象可以向基类对象转换,反之不可以
5)多继承和多重继承
多重继承 人类->士兵类->步兵类
多继承 :一个派生类有多个基类
class Worker{};class Farmer{};class MigrantWorker:ppublic Worker.public Farmer{};默认情况下,以private继承#include<iostream>#include<string>using namespace std;class Farmer{public: Farmer(string name="Jack"){ m_strName = name; cout << "Farmer()" << endl; } virtual ~Farmer(){ cout << "~Farmer()" << endl; } void sow();protected: string m_strName;};void Farmer::sow(){ cout << m_strName << endl; cout << "Farmer--souw()" << endl;}class Worker{public: Worker(string code="001"){ m_strCode = code; cout << "Worker()" << endl; } virtual ~Worker(){ cout << "~Worker()" << endl; } void carry(){ cout << m_strCode << endl; cout << "Worker--carry()" << endl; }protected: string m_strCode;};class MigrantWorker:public Farmer,public Worker{public: MigrantWorker(string name, string code); ~MigrantWorker(){ cout << "~MigrantWorker()" << endl; }};MigrantWorker::MigrantWorker(string name, string code) :Farmer(name), Worker(code){//构造函数与初始化列表顺序一致 cout << "MigranWorker()" << endl;}int main(){ MigrantWorker *p = new MigrantWorker("huheqing", "112"); p->carry(); p->sow(); delete p; p = NULL; return 0;}
6)虚继承
菱形继承
既有多继承又有多重继承,存在数据冗余问题
Class Worker:virtual public Person{
};
Class Farmer:virtual public Person{
};
Class MigranFarmer:public Worker,public Farmer{
};
注意:在多继承或者多重继承时,在实例化对象时,父类带参数的构造函数的实参通过子类的构造函数初始化列表进行传递
#include<iostream>#include<string>using namespace std;class Person{public: Person(string color="blue"){ m_strColor = color; cout << "Person()" << endl; } virtual ~Person(){ cout << "~Person()" << endl; } void printColor(){ cout << m_strColor << endl; cout << "printColor()" << endl; }protected: string m_strColor;};class Farmer:virtual public Person{public: Farmer(string name = "Jack", string color = "blue"):Person(color){ m_strName = name; cout << "Farmer()" << endl; } virtual ~Farmer(){ cout << "~Farmer()" << endl; } void sow();protected: string m_strName;};void Farmer::sow(){ cout << m_strName << endl; cout << "Farmer--souw()" << endl;}class Worker:virtual public Person{public: Worker(string code = "001", string color = "blue") :Person(color){ m_strCode = code; cout << "Worker()" << endl; } virtual ~Worker(){ cout << "~Worker()" << endl; } void carry(){ cout << m_strCode << endl; cout << "Worker--carry()" << endl; }protected: string m_strCode;};class MigrantWorker:public Farmer,public Worker{public: MigrantWorker(string name, string code,string color); ~MigrantWorker(){ cout << "~MigrantWorker()" << endl; }};MigrantWorker::MigrantWorker(string name, string code,string color) :Farmer(name,color), Worker(code,color){//构造函数与初始化列表顺序一致 cout << "MigranWorker()" << endl;}int main(){ MigrantWorker *p = new MigrantWorker("huheqing", "112","black"); p->carry(); p->sow(); delete p; p = NULL; return 0;}
阅读全文
0 0
- object-c之继承
- Object-C之继承
- 【C++】:C++之继承
- objective-c之继承
- C ++之继承浅析
- 初识Objecive-C 之 继承
- 【C#】面向对象之继承
- 【C#】C#OOP编程之继承性
- 【C++】继承和多态之——菱形继承
- c与面象对象之继承
- IOS之Objective-C 的“多继承”
- IOS之Objective-C 的“多继承”
- Objective-C语法之继承、封装、多态
- Object-C: 学习实例之继承
- 用C实现面向对象之继承
- 【iOS开发之Objective-C】继承
- object -c笔记之导入和继承
- c++/java 之继承和接口
- nifi-集群搭建,新增用户
- 第五次作业
- JUnit initializationError解决
- PHP Trait续
- MPAndroidChart之LineChart源码分析
- C++之继承
- C语言结构体数组
- kafka数据可靠性深度解读
- 决定开始写博客
- springmvc json 响应http406解决
- WCF 消息推送
- 基于ICMP协议的ping程序实现
- vnc 连接linux centos 7 系统的桌面
- 判断String空值的效率排行