C++中的继承、多继承

在C++中,没有类似Java中java.lang.Object 或者OC种的NSObject的基类概念,和其他语言一样,继承可以让子类拥有父类所有成员(变量\函数)

成员的访问权限

成员的访问权限、继承方式有3种
public:公共的,任何地方都可以访问(struct默认public)
protected:子类内部、当前类内部可以访问
private:私有的,只有当前类内部可以访问(class默认)

注意:
子类可以访问父类成员的权限,是下面2中情况中权限最小的那个
成员本身的访问权限
上一级父类的继承方式
通常,我们使用public方式来继承,这样能保留父类原来的成员的访问权限,访问权限,不影响内存布局

class Person
{
protected:
    int m_age;
public:
    Person(){};
    ~Person(){};

    int getAge() {
        return m_age;
    }
};

class Student:private Person
{
private:
    int m_score;
public:
    Student(){}; //子类调用父类的构造方法
    ~Student(){};
    void disPlay() {
        cout << m_age << endl;
    }
};


int main(){
    Student p;
    cout << p.getAge() << endl;  //这里p.getAge() 无法调用,因为student的父类是通过private继承的,相当于将父类的getAge方法改成了private权限
    return 0;
}

父类的构造函数

子类的构造函数会默认的调用父类的无参构造函数,
如果子类的构造函数显式的调用了父类的构造函数,就不会再去调用父类的无参构造函数,
如果父类缺少无参的构造函数,子类的构造函数必须显式调用父类的构造函数

继承体系下的构造函数的调用

class Person
{
protected: //可以让子类访问
    int m_age;
public:
    Person():Person(1){}; //构造函数之间的相互调用
    Person(int age):m_age(age){};
    ~Person(){};

    int getAge() {
        return m_age;
    }
};

class Student:public Person
{
private:
    int m_score;
public:
    Student():Student(0,0){};
    Student(int age,int score):Person(age),m_score(score){}; //子类调用父类的构造方法
    ~Student(){};
    void disPlay() {
        cout << m_age << endl;
    }
};

C++中的多继承

在C++中一个类可以有多个父类,虽然不建议这么做。

class Worker
{
protected:
    int m_money;
public:
    Worker(int money):m_money(money){};
    ~Worker(){};
    void work() {
        cout << "work" << endl;
    }
};

class Student
{
protected:
    int m_score;
public:
    Student(int score):m_score(score){}; //子类调用父类的构造方法
    ~Student(){};
    void study() {
        cout << "study" << endl;
    }
};

class Manager:public Worker,public Student
{
public:
    Manager(int money,int score):Student(score),Worker(money) {}; //多继承中如何调用父类的构造函数
    ~Manager() {};
    void disPlay() {
        study();
        work();
        cout << m_money << "---" << m_score << endl; 
    }
};

int main(){
    Manager m(10,10);
    m.disPlay();
    return 0;
}

多继承中的虚函数

构造函数和析构函数的调用顺序

创建子类对象,构造函数是父类的构造函数先调用,在析构的时候,子类的析构函数先调用。

posted @ 2021-08-17 16:51  弄啥来  阅读(315)  评论(0)    收藏  举报