继承与派生
在教材中给出的对类的继承和派生的解释:
“类的继承,是新的类从已有类那里得到已有的特性。”
“从已有的类产生新类的过程就是类的派生。”
新的类是基类的派生类,新的类从基类处得到已有的特性。
一、继承与派生举例
新的类是基类的派生类,新的类从基类处得到已有的特性。
例1、写一个类student,再写一个Student类的派生类Undergraduate。
代码:
#define _CRT_SECURE_NOWARNINGS #include<iostream> #include<string> using namespace std; class Student { public: Student() { name = "abcd"; old = 0; } Student(string String1,int years) { name = String1; old = years; } void SetNO(string String1, int years) { name = String1; old = years; } string Getname() { return name; } int Getold() { return old; } private: string name; int old; }; class Undergrauate : public Student { public: Undergrauate() { school = "xx大学"; major = "xx专业"; } Undergrauate(string S,string M,string N,int O) { school = S; major = M; SetNO(N, O); } string Getschool() { return school; } string Getmajor() { return major; } private: string school; string major; }; int main() { Undergrauate student1("西南石油大学","计算机科学与技术专业","海绵宝宝",18); cout << "姓名:" << student1.Getname() << endl; cout << "年龄:" << student1.Getold() << endl; cout << "学校:" << student1.Getschool() << endl; cout << "专业:" << student1.Getmajor() << endl; system("pause"); return 0; }
运行截图:
Student类从Undergraduate类继承了Undergraduate类的public成员,如成员函数Getname和成员函数Getold,在Student类中可以直接访问Undergraduate类的公有成员,在类外可以通过Student类访问Undergraduate类的公有成员。
在这里,Student类是Undergraduate类的派生类,Undergraduate类是Student类的基类。
二、类的继承方式(访问控制)
1、公有继承
“当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可访问。”
2、私有继承
“当类的继承方式为私有继承时,基类中的公有成员和保护成员都以私有成员身份出现在派生类中,而基类的私有成员在派生类中不可直接访问。”
3、保护继承
“保护继承中,基类的公有成员和保护成员都以保护成员的身份出现在派生类中,而基类的私有成员不可直接访问。”
例2、在例题1的基础上,规定继承方式为私有继承,并在设法验证该继承方式的特性。
在例题1代码的基础上,将继承方式修改为题目指定的私有继承。
编译器报错,不可再访问派生类从基类继承的基类中的公有函数,因为继承方式为私有继承,派生类继承的基类的公有成员和保护成员再派生类中的属性变为私有,固无法直接访问。
解决方法:由于私有成员不可直接访问,但可以通过成员函数去访问。在Student类中写两个函数,分别再在这两个函数中调用继承的Getname函数和Getold函数。然后在主函数中调用这两个新写的函数即可得到对象的成员name和成员old的值。
实验代码:
#define _CRT_SECURE_NOWARNINGS #include<iostream> #include<string> using namespace std; class Student { public: Student() { name = "abcd"; old = 0; } Student(string String1,int years) { name = String1; old = years; } void SetNO(string String1, int years) { name = String1; old = years; } string Getname() { return name; } int Getold() { return old; } private: string name; int old; }; class Undergrauate : private Student { public: Undergrauate() { school = "xx大学"; major = "xx专业"; } Undergrauate(string S,string M,string N,int O) { school = S; major = M; SetNO(N, O); } string Getschool() { return school; } string Getmajor() { return major; } string GetName() { return Getname(); } int GetOld() { return Getold(); } private: string school; string major; }; int main() { Undergrauate student1("西南石油大学","计算机科学与技术专业","海绵宝宝",18); cout << "姓名:" << student1.GetName() << endl; cout << "年龄:" << student1.GetOld() << endl; cout << "学校:" << student1.Getschool() << endl; cout << "专业:" << student1.Getmajor() << endl; system("pause"); return 0; }
运行截图:
总结:继承方式是怎样的,基类的公有成员和保护成员的属性在派生类中同继承的方式一样(公有继承除外,在公有继承中,基类的成员继承到派生类中时其属性不变),且无论继承方式是什么,派生类都不可直接访问基类的私有成员。