目录
笔记部分:
当从已有的类中派生出新的类时,可以对派生类做以下几种变化:
1、 可以继承基类的成员数据或成员函数。
2、可以增加新的成员变量。
3、可以增加新的成员函数。
4、可以重新定义已有的成员函数。
5、可以改变现有的成员属性。
派生并不是简单的扩充,有可能改变基类的性质。
有三种派生方式:公有派生、保护派生、私有派生。
默认的是私有派生。
公有派生
class ClassName: public BaseClassName
公有派生时,基类中所有成员在派生类中保持各个成员的访问权限。
基类成员属性 | 派生类中 | 派生类外 |
公有 | 可以引用 | 可以引用 |
保护 | 可以引用 | 不可引用 |
私有 | 不可引用 | 不可引用 |
基类:public: 在派生类和类外可以使用
protected: 在派生类中使用
private: 不能在派生类中使用
私有派生
class ClassName: private BaseClassName
私有派生时,基类中公有成员和保护成员在派生类中均变为私有的,在派生类中仍可直接使用这些成员,基类中的私有成员,在派生类中不可直接使用。
基类成员属性 | 派生类中 | 派生类外 |
公有 | 可以引用 | 不可引用 |
保护 | 可以引用 | 不可引用 |
私有 | 不可引用 | 不可引用 |
基类:public: (变为私有)在派生类中使用,类外不可使用
protected: (变为私有)在派生类中使用,类外不可使用
private: 不能在派生类中和类外使用
保护派生:
class ClassName: protected BaseClassName
保护派生时,基类中公有成员和保护成员在派生类中均变为保护的和私有的,在派生类中仍可直接使用这些成员,基类中的私有成员,在派生类中不可直接使用。
基类成员属性 | 派生类中 | 派生类外 |
公有 | 可以引用 | 不可引用 |
保护 | 可以引用 | 不可引用 |
私有 | 不可引用 | 不可引用 |
基类:public: (变为保护)在派生类中使用,类外不可使用
protected: (变为私有)在派生类中使用,类外不可使用
private: 不能在派生类中和类外使用
初始化基类成员:
构造函数不能被继承,派生类的构造函数必须调用基类的构造函数来初始化基类成员基类子对象。
派生类构造函数的调用顺序如下:
基类的构造函数
子对象类的构造函数
派生类的构造函数
当撤销派生类对象是,析构函数的调用正好相反。
当派生类中新增加的数据或函数与基类中原有函数同名时,若不加限制,则优先调用派生类中的成员。
基类与对象成员
任一基类在派生类中只能继承一次,否则,会造成成员名的冲突
若在派生类中,确实要有两个以上的基类的成员,则可用基类的两个对象作为派生类的成员。
把一个类作为派生类的基类,或吧一个雷的对象作为一个类的成员,在使用上是有区别的。在派生类中可直接使用基类的成员(访问权限允许的话),但是要使用对象成员的成员时,必须在对象名后加上成员运算符“.”和成员名。
虚基类:
在多重派生的过程中,若使公共基类在派生类中只有一个拷贝,则可将这种基类说明为虚基类。
在派生类的定义中,只要在基类的类名前加上关键字virtual,就可以将基类声明为虚基类。
class B : virtual public A
{
public:
int y;
B( int a=0, int b=0 ):A(b){ y = a ;}
};
由虚基类派生出的对象初始化时,直接调用虚基类中的构造函数。因此,若将一个类定义文虚基类,则一定有正确的构造函数可供所有的派生类调用。
代码部分:
代码逻辑:
zaixiaorenyuan是虚基类,ID是以下子类(孙类)共有的,因此涉及二义性的问题。
student继承zaixiaorenyuan;
teacher继承zaixiaorenyuan;
graduate继承student 和teacher;
#include <iostream>
using namespace std;
class zaixiaorenyuan//ID是共有的,所以涉及二义性的问题
{
protected:
string ID;
public:
zaixiaorenyuan(string ID)
{
cout << "zaixiaorenyuan有参构造函数正在执行……" << endl;
this->ID = ID;
}
zaixiaorenyuan()
{
cout << "zaixiaorenyuan无参构造函数正在执行……" << endl;
this->ID = "unkonwn_ID";
}
~zaixiaorenyuan() { cout << "zaixiaorenyuan析构函数正在执行……" << endl; }
void showIDinfo()
{
cout << "this person's IDinfo is " << this->ID << endl;
}
};
class student :virtual public zaixiaorenyuan//虚拟继承
{
protected:
static int cnt;
static string school;
string name;
int chinese;
int math;
int english;
double getaverage()
{
return (chinese + math + english) * 1.0 / 3;
}
public:
student(string, int, int, int, string);
student(string);
student();
~student() { cout << "学生类析构函数正在执行……" << endl; }
void getinfo(string, int, int, int);
void showinfo();
};
int student::cnt = 0;
string student::school = "东北师大附中";
student::student(string name, int chinese, int math, int english, string ID) : zaixiaorenyuan(ID)
{
cout << "学生类有参构造函数正在执行……" << endl;
this->name = name;
this->chinese = chinese;
this->math = math;
this->english = english;
this->ID = "本校学生";
}
student::student(string ID) :zaixiaorenyuan(ID)
{
cout << "学生类无参构造函数正在执行……" << endl;
this->name = "unknown_name";
this->chinese = 0;
this->math = 0;
this->english = 0;
this->ID = "本校学生";
}
student::student()
{
cout << "学生类无参构造函数正在执行……" << endl;
this->name = "unknown_name";
this->chinese = 0;
this->math = 0;
this->english = 0;
}
inline void student::getinfo(string name, int chinese, int math, int english)
{
cout << "学生类的getinfo函数正在执行……" << endl;
this->name = name;
this->chinese = chinese;
this->math = math;
this->english = english;
this->ID = "本校学生";
}
inline void student::showinfo()
{
cnt++;
cout << "学生类showinfo函数正在执行……" << endl;
cout << "第" << cnt << "个学生的信息为:" << endl;
cout << "name:" << this->name << endl;
cout << "chinese:" << this->chinese << endl;
cout << "math:" << this->math << endl;
cout << "english:" << this->english << endl;
cout << "平均成绩为:" << getaverage() << endl;
cout << "学生类showinfo函数执行完毕。" << endl << endl;
}
class teacher:virtual public zaixiaorenyuan//虚拟继承
{
protected:
static int cnt;
static string school;
string name;
string title;
public:
teacher(string, string, string);
teacher(string);
teacher();
~teacher() { cout << "teacher类析构函数正在执行……" << endl; }
void getinfo(string,string);
void showinfo();
};
int teacher::cnt = 0;
string teacher::school = "东北师大附中";
teacher::teacher(string name, string title, string ID) :zaixiaorenyuan(ID)
{
cout << "教师类有参构造函数正在执行……" << endl;
this->name = name;
this->title = title;
this->ID = "在职教师";
}
teacher::teacher(string ID) :zaixiaorenyuan(ID)
{
cout << "未认证教师类构造函数正在执行……" << endl;
this->name = "unknown_name";
this->title = "unknown_title";
this->ID = "在职教师";
}
teacher::teacher()
{
cout << "teacher类无参构造函数正在执行……" << endl;
this->name = "unknown_name";
this->title = "unknown_title";
}
inline void teacher::getinfo(string name, string title)
{
cout << "教师类的getinfo函数正在执行……" << endl;
this->name = name;
this->title = title;
this->ID = "在职教师";
}
inline void teacher::showinfo()
{
cout << "teacher类showinfo函数正在执行……" << endl;
this->cnt++;
cout << "第" << this->cnt << "位教师的信息为:" << endl;
cout << "教师姓名" << this->name << endl;
cout << "教师头衔" << this->title << endl << endl;
}
class graduate :public teacher, student//多重继承
{
protected:
static int cnt;
static string school;
string name;
int article;
void checkscores();
public:
graduate(string,int, string, int, int, int, string, string, string);
graduate();
void showscores();
void showinfo();
};
int graduate::cnt = 0;
string graduate::school = "东北师大附附中";
graduate::graduate(string name, int article,
string name1, int chinese, int math, int english,
string name2, string title, string ID) :
student(name1, chinese, math, english, ID),
teacher(name2, title, ID),
zaixiaorenyuan(ID)
{
cout << "研究生类有参构造函数正在执行……" << endl;
this->name = name;
this->article = article;
this->name = name1;
this->chinese = chinese;
this->math = math;
this->english = english;
this->name = name2;
this->title = title;
this->ID = "在校研究生";
}
graduate::graduate()
{
cout << "研究生类无参构造函数正在执行……" << endl;
this->name = "unkonwn_name_graduate";
this->article = 0;
this->name = "unknown_name_student";
this->chinese = 0;
this->math = 0;
this->english = 0;
this->name = "unknown_name_teacher";
this->title = "unknown_title";
}
inline void graduate::checkscores()
{
cout << "研究生类的checkscores函数正在执行……" << endl;
cout << "name:" << this->name << endl;
cout << "chinese:" << this->chinese << endl;
cout << "math:" << this->math << endl;
cout << "english:" << this->english << endl;
}
inline void graduate::showscores()
{
checkscores();
}
inline void graduate::showinfo()
{
cout << "研究生类的showinfo函数正在执行……" << endl;
cout << "name:" << this->name << endl;
cout << "article:" << this->article << endl;
}
int main()
{
cout << "请依次输入学生姓名与成绩" << endl;
student st[3];
string name1; int chinese, math, english;
string ID;
cout << endl;
for (int i = 0; i < 3; i++)
{
cout << "第" << i + 1 << "名学生的姓名与成绩为" << endl;
cin >> name1 >> chinese >> math >> english;
st[i].getinfo(name1, chinese, math, english);
}
cout << endl;
for (int i = 0; i < 3; i++)
st[i].showinfo();
cout << endl;
teacher tea[3];
string name2, title;
for (int i = 0; i < 3; i++)
{
cout << "请输入老师的姓名和头衔:" << endl;
cin >> name2 >> title;
tea[i].getinfo(name2, title);
}
cout << endl;
for (int i = 0; i < 3; i++)
tea[i].showinfo();
graduate gra("宋研究生", 100, "吴同学", 99, 88, 77, "李老师", "老师", ID);
gra.showscores();
gra.showinfo();
return 0;
}
/*
zhang 99 88 77
li 88 77 66
wang 66 55 44
zhao 教授
xue 教授
wu 博士生导师
*/
代码运行结果: