class Student3 :public Student
{
public:
Student3(int id, string name, int score) :Student(id, name) //继承父类,并使用父类的构造方法赋值id和name
{
this->score = score;
}
void printS(){
Student::printS(); //调用父类的方法
cout << "score:" << this->score << endl;
}
private:
}
类的继承方式
类的继承方式分为公有继承、私有继承、保护继承。
public | protected | private | |
---|---|---|---|
公有继承 | public | protected | 不可见 |
保护继承 | protected | protected | 不可见 |
私有继承 | private | private | 不可见 |
public表示类成员不仅自己可以用,外部成员也可以访问
protected表示类成员自己可以用,外部不能用
private和protected一样外部不能用,内部可以用
private成员在子类中任然存在,但是无法访问到
protectedh和private的区别只要体现在子类的子类访问上,如果子类protected继承父类,子类中的成员public和protected都变成protected权限了,子类的子类的访问也会受影响
在公有继承下,父类中的公有、私有、保护成员的在子类中的权限不变
在保护继承下,父类中的公有、保护在子类中权限都为保护,私有不可见
在私有继承下,父类中的公有、保护、私有在子类权限都为私有。
继承的兼容
子类对象可以当作父类对象使用
Child c;
Parent p = c; 可以
c.printP(); 可以
p.printC(); 不可以
子类对象可以直接赋值给父类对象
子类对象可以直接初始化父类对象
父类指针可以直接指向子类对象
Child *cp = NULL;
Parent *pp = NULL;
Child c;
Parent p;
pp = &c; 可以
cp = &p; 不可以,cp获取p以外的元素溢出
父类引用可以直接引用子类对象
继承 构造函数、析构函数
执行子类的构造函数前会先执行父类的构造函数
执行析构函数时,会先调用子类的析构函数
子类父类中出现重名变量
Parent::a 父类a的访问
this->a 子类a的访问
多继承
多继承是指一个子类继承了多个父类的情况,这种情况下,多个父类的属性都会在子类中出现。
虚继承指的是假如两个子类继承了同一个父类,而这两个子类又被下一代子类进行了多继承,那么父类中的变量会在两个子类中出现,也会在下一代子类中出现,这样下一代子类会出现两个来自父类的变量
这样会开辟两份空间,为了避免这种情况,需要在继承的时候加上virtual。
class Parent{
int a;
}
class Son :public Parent{
a 会有继承parent的a
int b;
}
class Daughter :public Parent{
a 会有继承parent的a
int c;
}
class GrandSon :public Son, Daughter{
这里会出现两个a
a,a,b,c;
}
class Parent{
int a;
}
class Son :virtual public Parent{
a 会有继承parent的a
int b;
}
class Daughter :virtual public Parent{
a 会有继承parent的a
int c;
}
class GrandSon :public Son, Daughter{
只会有一个a
a,b,c;
}
这样只会开辟一份空间了。