语法
// class 子类名称 : 继承方式 父类名称 {}
class Student: public Person {};
继承方式
前提: 父类中的私有成员无论采用哪种继承方式,都不会被继承
- 公共继承
父类中各成员的访问权限不变
- 保护继承
父类中除私有成员外,其他成员的访问权限都变成protected
- 私有继承
父类中各成员均继承为private
成员
继承中的对象模型
class Father {
public:
int a;
protected:
int b;
private:
int c;
};
class Son: public Father {
public:
int d;
};
int main() {
cout << sizeof(Son); //16
return 0;
}
父类中的所有非静态成员变量都会被子类继承,只是父类的私有属性会被编译器隐藏,无法访问
继承中的构造和析构顺序
class Father {
public:
Father() {
cout << "Father的构造函数" << endl;
}
~Father() {
cout << "Father的析构函数" << endl;
}
};
class Son: public Father {
public:
Son() {
cout << "Son的构造函数" << endl;
}
~Son() {
cout << "Son的析构函数" << endl;
}
};
int main() {
Son s1;
return 0;
}
//Father的构造函数
//Son的构造函数
//Son的析构函数
//Father的析构函数
继承中同名成员的处理方式
- 访问子类成员,直接访问即可
- 访问父类同名成员,需要添加作用域
class Father {
public:
Father():a(100) {}
int a;
void func() {
cout << "Father - func() 调用" << endl;
}
void func(int n) {
cout << "Father - func(int n) 调用" << endl;
}
};
class Son: public Father {
public:
Son():a(200) {}
int a;
void func() {
cout << "Son - func() 调用" << endl;
}
};
int main() {
Son s1;
cout << s1.a << endl; //200
cout << s1.Father::a << endl; //100
s1.func(); //Son - func() 调用
s1.Father::func(); //Father - func() 调用
//s1.func(100); //编译不通过。只要子类中出现了和父类重名的函数,父类中的相关函数都会被隐藏
s1.Father::func(100); //要想访问被隐藏的父类中的成员函数,需要加上作用域
return 0;
}
多继承语法
// class 子类名称 : 继承方式 父类名称, 继承方式 父类名称[, 继承方式 父类名称...] {}
class Son: public Base1, public Base2 {};
如果多个父类中有重名的成员,那么要访问某个成员的话,需要加上作用域来指定
所以实际开发中,不建议使用多继承
菱形继承和虚继承
//菱形继承
class Animal {
public:
int age;
};
class Sheep: public Animal {};
class Tuo: public Animal {};
class SheepTuo: public Sheep, public Tuo {};
int main() {
SheepTuo st;
//st.age = 18; //报错,两个父类中都有age成员
st.Sheep::age = 18;
st.Tuo::age = 28; //虽然不报错,但是我们只需要一份相关数据,这时候就要用虚继承
return 0;
}
class Animal {
public:
int age;
};
class Sheep: virtual public Animal {}; //虚继承
class Tuo: virtual public Animal {}; //虚继承
class SheepTuo: public Sheep, public Tuo {};
//从两个父类继承下来的是两个vbptr指针(virtual base pointer),都指向Animal类的age变量
int main() {
SheepTuo st;
st.Sheep::age = 28;
st.Tuo::age = 18;
cout << st.age; //18,因为st对象只有一个age成员
return 0;
}