三种继承方式
公有继承
#include<iostream> #include<string> using namespace std; class Student{ public: Student(string s,int g,int a){//基类构造函数 cout<<"调用基类构造函数"<<endl; name=s;grade=g;age=a; } void print(){ cout<<"Student:"<<endl; cout<<"name="<<name<<endl; cout<<"grade="<<grade<<endl; cout<<"age="<<age<<endl; } protected: string name; int grade; private: int age; }; class GraduateStudent:public Student{//公有继承:无法继承和访问age; 将name、grade继承为自己的保护成员; 将print函数继承为自己的公有成员 public: GraduateStudent(string s,int g,int a):Student(s,g,a){//调用基类的构造函数构造基类 cout<<"调用继承类构造函数"<<endl; } void print1(){ cout<<"GraduateStudent:"<<endl; cout<<"name="<<name<<endl; cout<<"grade="<<grade<<endl; //cout<<"age="<<age<<endl;//本句会报错,因为age是基类的私有变量,继承类中无法访问 } }; int main(){ GraduateStudent g("Ouyang",95,21);//先调用基类构造函数,再调用继承类构造函数 //cout<<g.name<<endl;//本句报错,因为name是基类中的保护成员,在基类和继承类之外均无法访问 g.print();//print函数是基类的公有成员,故可以访问 g.print1(); return 0; }
注意事项:
- 基类的私有成员,子类不可以访问
- 基类的保护成员,子类可以继承为自己的保护成员,在派生类可以访问,在外部不可以访问。
- 基类的公有成员,子类可以继承为自己的公有成员。在派生类可以访问,在外部也可以访问。输出结果:
保护继承
#include<iostream> #include<string> using namespace std; class Student{ public : Student(string s, int g,int a){ cout << "调用基类构造函数" << endl; name = s; grade = g; age = a; } void print(){ cout << "Student:" << endl; cout << "name=" << name << endl; cout << "grade=" << grade<<endl; cout << "age=" << age << endl; } string name; int grade; private: int age; }; class GraduateStudent :protected Student{//保护继承:无法继承和访问基类的私有成员; 将基类的保护成员name、grade、print均继承为自己的保护成员 public: GraduateStudent(string s, int g, int a) :Student(s, g, a){ //调用基类的构造函数,构造基类 cout << "调用继承类构造函数" << endl; } void print1(){ cout << "GraduateStudent:" << endl; cout << "name= " << name << endl; cout << "grade= " << grade << endl; } }; int main(){ Student s("putao",0,2);//基类成员:s s.print(); GraduateStudent g("Ouyang", 95, 21);//继承类成员:g //g.print();//编译出错,print函数成为了继承类中的保护成员,故main函数中直接访问 g.print1(); return 0; }
注意事项:
基类公有成员,子类中继承为自己的保护成员,在派生类可以访问,在外部不可以访问
基类保护成员,子类中继承为自己的保护成员,在派生类可以访问,在外部不可以访问
基类私有成员,子类一样不可以访问基类的私有成员。
输出结果:
私有继承:
(1) 基类公有成员,子类中继承为自己的私有成员,在派生类可以访问,在外部不可以访问。
(2). 基类保护成员,子类中继承为自己的私有成员,在派生类可以访问,在外部不可以访问。
(3) 基类私有成员,子类一样不可以访问基类的私有成员。
三种继承方式的比较:
三种继承方式都不能访问上一级的私有成员。
公有继承:成员属性不变;保护继承:继承后的成员属性均为保护;私有继承:继承后的成员属性均为私有成员
为提醒类的独立性,我们希望通过调用基类的成员函数去初始化这些成员变量;故派生类是通过调用基类的构造函数,实现对成员变量的初始化。