转载:https://blog.csdn.net/qq_35644234/article/details/52825311
一、前言
继承是c++语言一个重要的机制,该机制自动地为一个类提供来自另一个类的操作和数据结构,这使得程序员只需在新类中定义已有的类中没有的成分来建立一个新类。
二、继承解释
继承是类的重要特性。A类继承B类,我称B类为“基类”,A为“子类”。A类继承了B类之后,A类就具有了B类的部分成员,具体得到了那些成员,这得由两个方面决定:
- 继承方式
- 基类成员的访问权限
三、三种继承方式
- 公有继承
#include<iostream>
#include<string>
using namespace std;
class Student
{
public :
Student(string s, int g,int a)
{
cout << "Constuct Student" << 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 //继承方式i
{
public:
GraduateStudent(string s, int g, int a) :Student(s, g, a) //调用基类的构造函数,构造基类
{
cout << "Constuct GraduateStudent" << endl;
}
/*
公有继承方式,会把基类的公有成员(变量和函数)继承到子类公有成员,保护成员
变成基类的保护成员,但是私有成员子类也一样不可以访问
*/
void print1()
{
cout << "GraduateStudent:" << endl;
cout << "name= " << name << endl;
cout << "grade= " << grade << endl;
}
};
void main()
{
GraduateStudent g("Ouyang", 95, 21);
g.print(); //子类可以直接访问基类公共成员成员
g.print1();
system("pause");
}
公有继承方式:
把基类的公有成员(变量和函数)继承到子类公有成员,保护成员变成基类的保护成员,但是私有成员子类也一样不可以访问
注意事项:
- 基类的公有成员,子类可以继承为自己的公有成员。在派生类可以访问,在外部也可以访问。
- 基类的保护成员,子类可以继承为自己的保护成员,在派生类可以访问,在外部不可以访问。
- 基类的私有成员,子类不可以访问
- 保护继承
#include<iostream>
#include<string>
using namespace std;
class Student
{
public :
Student(string s, int g,int a)
{
cout << "Constuct Student" << 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 //继承方式i
{
public:
GraduateStudent(string s, int g, int a) :Student(s, g, a) //调用基类的构造函数,构造基类
{
cout << "Constuct GraduateStudent" << endl;
}
/*
保护继承方式,会把基类的公有成员或者保护成员(变量和函数)变成子类的保护成员,但是私有成员子类也一样不可以访问
*/
void print1()
{
cout << "GraduateStudent:" << endl;
cout << "name= " << name << endl;
cout << "grade= " << grade << endl;
}
};
void main()
{
GraduateStudent g("Ouyang", 95, 21);
//g.print(); 编译出错 无法直接访问子类的公有成员了
g.print1();
system("pause");
}
保护继承方式:
会把基类的公有成员或者保护成员(变量和函数)变成子类的保护成员,但是私有成员子类也一样不可以访问
注意事项:
- 基类公有成员,子类中继承为自己的保护成员,在派生类可以访问,在外部不可以访问
- 基类保护成员,子类中继承为自己的保护成员,在派生类可以访问,在外部不可以访问
- 基类私有成员,子类一样不可以访问基类的私有成员。
- 私有继承
私有继承方式:
就是在继承时,把protected变成private
注意的事项:
- 基类公有成员,子类中继承为自己的私有成员,在派生类可以访问,在外部不可以访问。
- 基类保护成员,子类中继承为自己的私有成员,在派生类可以访问,在外部不可以访问。
- 基类私有成员,子类一样不可以访问基类的私有成员
四、三种继承方式比较
从上面的结果来看,私有继承和保护继承作用完全一样。仔细一想其实还是有区别,区别是如果派生类再一次去派生其它类时,对于刚才的私有继承来说,再派生的类将得不到任何成员。而对于刚才的保护继承,仍能够得到基类的公有和保护成员。
五、派生类的构造
派生类是可以访问基类保护的数据成员,但是还有一些私有数据成员,派生类是无法访问的,并且为提醒类的独立性,我们还是希望通过调用基类的成员函数去初始化这些成员变量,所以派生类是通过调用基类的构造函数,实现对成员变量的初始化。具体代码示例,见上。