引出类的继承和派生
在不同的类中,数据成员和成员函数是不同的,但有时,两个类的基本内容或有一部分相同,我们自然就想到,利用原来的类为基础,加上新的内容即可,以减少重复的工作量,C++继承就是解决这类问题。
C++的继承就是在一个已有的类的基础上建立一个新的类。
从一个已有的类中产生一个新的子类就叫派生。
派生类的声明方式
声明派生的一般形式:
class 派生类名:[继承方式] 基类名
{
派生类增加新成员
};
派生类成员的访问属性
公有继承
基类中的公用成员和保护成员在派生中保持原有的访问属性,其私有成员扔为基类的私有(不可以被派生类访问)
#include "iostream"
using namespace std;
class Student
{
public:
void get(int n,string na,char s)
{
num = n;
name = na;
sex = s;
}
void display()
{
cout<<"name: " <<name <<endl;
cout<<"num: " <<num <<endl;
cout<<"sex: " <<sex <<endl;
}
private:
int num;
string name;
char sex;
};
class Student1:public Student //以public方式声明派生类Student1
{
public:
void get1(int num1, string name1,char sex1, int age1, string addr1 )
{
get(num1, name1,sex1);
age = age1; //引用派生类私有成员,正确
addr = addr1;
}
void display1()
{
cout <<"age: "<<age <<endl;
cout <<"addr: "<<addr<<endl;
}
private:
int age;
string addr;
};
int main()
{
Student1 stud;
stud.get1 (10286,"yqq",'B',27,"Beijing");
stud.display(); //调用基类中公有数据成员
stud.display1(); //调用派生类中公有数据成员
}
注意:
不能在派生类中调用基类的私有成员,比如在派生类中:
class Student1: public Student
{
public:
void display1()
{
cout<<"name : "<<name<<endl; //错误,在派生类中引用基类的成员
......
......
}
}
私有继承
采用私有继承方式时,基类中的公有成员和保护成员都是以私有成员的身份出现在派生类中,而基类中的成员函数在派生类中不可以直接访问。
对于派生类B的公有成员来自本身,私有成员来自本身的私有成员、基类中的公有成员、基类中的保护成员。
#include "iostream"
using namespace std;
class Student
{
public:
void get(int n,string na,char s)
{
num = n;
name = na;
sex = s;
}
void display()
{
cout<<"name: " <<name <<endl;
cout<<"num: " <<num <<endl;
cout<<"sex: " <<sex <<endl;
}
private:
int num;
string name;
char sex;
};
class Student1:private Student //以private方式声明派生类Student1
{
public:
void get1(int num1, string name1,char sex1, int age1, string addr1 )
{
get(num1, name1,sex1);
age = age1;
addr = addr1;
}
void display1()
{
display(); //基类中的公有有成员函数
cout <<"age: "<<age <<endl;
cout <<"addr: "<<addr<<endl;
}
private:
int age;
string addr;
};
int main()
{
Student1 stud;
stud.get1 (10286,"yqq",'B',27,"Beijing");
stud.display1(); //调用派生类中公有数据成员
return 0;
}
基类中的公有成员函数display()在派生类中是私有成员函数,只能在派生类中引用。
保护继承
受保护的成员不能被类外访问,这点和私有成员类似,可以认为保护成员对类的用户来说是私有的。如果基类中声明了私有成员,那么任何类是不能访问的它们的,只希望在派生类中访问他们,应该声明为保护成员,一个类中声明了保护成员,就意味着该类可能要用作基类。在它派生类中可能用到它们。
基类中的公有成员和保护成员,都以保护成员的身份出现在派生类中,而基类中的私有成员不可以直接访问。这样派生类中成员函数可以直接访问从基类继承的公有成员和保护成员,但是在类外却无法访问。
对于直接派生,私有继承和保护继承两种作用是相同的。在类外不能访问任何成员,在派生类中可以通过成员函数访问基类中的公有成员和保护成员。但是如果继承类继续派生,在新的派生类中,两种继承类作用不一样,例如,用公有继承方式派生出一个新的派生类,原来私有的基类中成员在派生中不可以访问,原来是公有的和保护的成员在派生类中为保护成员,可以被新派生类访问。
在派生类中引用保护成员
#include "iostream"
using namespace std;
class Student
{
public:
void get(int n,string na,char s)
{
num = n;
name = na;
sex = s;
}
void display()
{
cout<<"name: " <<name <<endl;
cout<<"num: " <<num <<endl;
cout<<"sex: " <<sex <<endl;
}
protected:
int num;
string name;
char sex;
};
class Student1:protected Student //以protected方式声明派生类Student1
{
public:
void get1(int num1, string name1,char sex1, int age1, string addr1 )
{
get(num1, name1,sex1);
age = age1;
addr = addr1;
}
void display1()
{
cout<<"name: " <<name <<endl; //引用基类的保护成员,合法
cout<<"num: " <<num <<endl;
cout<<"sex: " <<sex <<endl;
cout <<"age: "<<age <<endl;
cout <<"addr: "<<addr<<endl;
}
protected:
int age;
string addr;
};
int main()
{
Student1 stud;
stud.get1 (10286,"yqq",'B',27,"Beijing");
stud.display1(); //调用派生类中公有数据成员
return 0;
}
基类成员在派生中访问属性
记住:私有>保护>公有