C++作为面向对象的语言,类之间可以继承,被继承的类称为基类(父类),产生的新类称为派生类(子类)。
C++的类权限分为三个等级,private(私有的),protect(被保护的),public(公有的)。其相对应的继承的权限也分为相同的三个等级,即private,protect以及public继承。
这三类继承抽象自现实社会的财产继承:
private继承可视为吝啬鬼的继承,将所有继承下来的资源都据为己有,不容外人的窥探,而他本人继承的财产也需遵守父辈的权限。这种继承而来的类所有成员变量和成员函数都变成私有的,外部无法对其调用,只能在类内部通过成员函数调用,其成员函数的调用权限则继承于它的基类,如下方代码所示,m_name,m_age,m_sex三个成员变量在基类(父类)中分别属于private,protect以及public权限,则在派生类(子类),其权限也与基类(父类)相同,m_name属于父类的私有变量,虽然子类继承时包含它,却在子类内部无法被调用。m_age,m_sex作为protect和public变量,可以在子类内部被调用。同样的,在此派生类作为基类被再次继承的时候,它的派生类将遵循此类的权限设定,即所有成员变量都为私有的,只可被继承,不能被调用。
private继承可视为家族式的继承,将除了父辈私有资源之外的资源都变为可传承的资源,同样不容外人的窥探。这种继承而来的类成员变量和成员函数外部同样无法对其调用,只能在类内部通过成员函数调用,其成员函数的调用权限也同样继承于它的基类。在类的内部,其调用与private继承类似,不同的是在此派生类作为基类继承时,其public和protected权限的成员变量都变为protected成员变量被继承,其子类仅可在子类内部调用。
public继承可视为抄袭式的继承,其继承的所有资源与父辈的权限相同,这种继承而来的类成员变量和成员函数,public权限下的成员变量和成员函数可通过外部调用。在类的内部,其调用与protected继承相同。在此派生类作为基类继承时,其public成员变量及函数被继承时仍旧是public权限。
#include <iostream>
#include <string.h>
using namespace std;
class People
{
string m_name;
public:
int m_age;
protected:
string m_sex;
};
class Student:public People
{
public:
void set1(string n,int a,string sex);
void print1();
};
void Student::set1(string n,int a,string sex)
{
m_age = a;
//m_name = n;
m_sex = sex;
}
void Student::print1()
{
//cout << "m_name = " << m_name << endl;
cout << "m_age = " << m_age << endl;
cout << "m_sex = " << m_sex << endl;
}
class Student1:protected People
{
public:
void set1(string n,int a,string sex);
void print1();
};
void Student1::set1(string n,int a,string sex)
{
m_age = a;
//m_name = n;
m_sex = sex;
}
void Student1::print1()
{
//cout << "m_name = " << m_name << endl;
cout << "m_age = " << m_age << endl;
cout << "m_sex = " << m_sex << endl;
}
class Student2:private People
{
public:
void set1(string n,int a,string sex);
void print1();
};
void Student2::set1(string n,int a,string sex)
{
m_age = a;
//m_name = n;
m_sex = sex;
}
void Student2::print1()
{
//cout << "m_name = " << m_name << endl;
cout << "m_age = " << m_age << endl;
cout << "m_sex = " << m_sex << endl;
}
int main()
{
People p1;
Student1 s1;
Student s;
Student2 s2;
s.set1("lzn",20,"m");
s1.set1("lzn",19,"m");
s2.set1("lzn",18,"m");
s.print1();
s1.print1();
s2.print1();
return 0;
}