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;}
原创粉丝点击