1.类的三种继承方式和类的数据权限
(1)数据成员三种保护:
public | procted | private |
基类能访问 | 基类能访问,外部不能访问 | 基类不能访问 |
(2)继承方式:
基类属性 | public | procted | private |
子类public继承 | public | procted | private |
子类procted继承 | procted | procted | ptivate |
子类private继承 | private | private | private |
2.继承之后子类的构造函数和析构函数
(1)构造函数,实现的时候同参数列表初始化:类Son和类Father
Son::Son(string name.int age,string play):Father(string,age) {
this->play = play;
}
先调用父类的构造函数在调用子类的构造函数。如果没有指定参数列表,会找父类的默认无参构造函数,找不到传递就会报错。
(2)析构函数:析构的时候,先销毁子类再销毁基类,与构造的顺序相反,可以用cout<<__FUNCTION__<<endl;默认的 宏查看
(3)子类型:子类再一定情况下代替父类的职能;
①父类可以给父类赋值(因为子类含有的数据更多); ②父类指针可以指向子类对象。
3.多继承和虚基类
(1)多继承:会产生二义性问题,如Son类继承Father类的play()方法,也继承Mother的
play()方法。当调用Son.play()不知道会调用哪一个,所以可以Son.Father::play()解决。
(2)虚基类:当多继承是菱形的形状时:
要解决的问题:①中间的两个类继承同一个类,有有相同的数据。所以,最下面的类会继承两份相同的数据(可以通过查看内存中类的存储观察到),为了避免这种重复存储的现象,引入虚继承和虚继承。
②只需要在中间两个类继承加virtual关键字,则两条路只会备份一份相同数据。第一层的类称为虚基类。
(3)复杂多继承构造函数的初始化顺序:(有继承、聚合对象、静态对象)
class Studnt:pubic People {
public:Student();
private:
School s1,s2; //聚合对象成员
static Home h1; //静态对象成员
}
一定先初始化static静态对象,再初始化父类、最后是聚合对象。
4.C++的 IO类
(1)io常用头文件:<iostream> <fstream> <sstream>; 输入到文件、控制台和特殊的数据结构里面(如stringstream)
对文件的输入输出:
int inputFile() {
string name;
int age;
ofstream outfile; //定义输出流对象
outfile.open("user.txt"); //打开文件
while(1) {
cout<<"输入姓名、年龄:";
cin >>name;
if(cin.eof()) break; //遇到文件结束符
cin>>age;
outfile << name <<"\t"<< age <<endl; //输入到文件
}
outfile.close();
system("pause");
return 0;
}
int outputFile()
{
string name;
int age;
ifstream infile;
infile.open("user.txt");
while (1) {
infile >> name;
if (infile.eof()) { //判断文件是否结束
break;
}
cout << name << "\t";
infile >> age;
cout << age << endl;
}
// 关闭打开的文件
infile.close();
system("pause");
return 0;
}
(2)文件按照制指定格式输入和输出:
①文件输入:用C++的stringstream对象: 从格式中输出用C语言的sscanf对象。
int inputFile() { //按格式写如文件
string name;
int age;
ifstream infile;
infile.open("user1.txt");
while (1) {
cout<<"输入姓名:";
cin>>name;
if (infile.eof()) { //判断文件是否结束
break;
}
cout<<"输入年龄:";
cin>>age;
stringstream s;
s<<"姓名:"<<name <<"\t\t年龄:"<<age<<endl;
infile << s.str();
}
infile.close();
system("pause");
return 0;
}
int outputFile() { //从指定格式中读出数据
char name[32];
int age;
ifstream infile;
infile.open("user1.txt");
string line;
while (1) {
getline(infile,line);
if (infile.eof()) { //判断文件是否结束
break;
}
sscanf_s(line.c_str(),"姓名:%s 年龄:%d",name,sizeof(name),&age);
cout<<"姓名:"<<name <<"\t\t年龄:"<<age<<endl;
}
infile.close();
system("pause");
return 0;
}