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;
}
多继承中的虚函数
构造函数和析构函数的调用顺序
创建子类对象,构造函数是父类的构造函数先调用,在析构的时候,子类的析构函数先调用。

浙公网安备 33010602011771号