- 1.继承.
语法:class 子类名字:继承方式 父类名字
子类也称派生类
父类也称基类
class BasePage{
public:
void head(){
cout<<"头部"<<endl;
}
void footer(){
cout<<"尾部"<<endl;
}
};
//继承
class Java:public BasePage{
void content(){
cout<<"Java学科视频"<<endl;
}
}
class Base1{
public :
int A;
protect:
int B;
private:
int C;
}
class Te1 :public Base1{
A=100;
B = 100;
//C = 100;// 报错
}
class Te2 : protect Base1{
A=100;
B=100;
//C=100;
}
class Te3:private Base1{
A=100;
B=100;
//C=100;//
}
//继承public方式,权限变化:public :A,protect:B,private:C
void test01(){
Te1 t;
t.A=200;
//t.B=300;//报错
//t.C=400;//报错
}
//继承protect方式,权限变化:protect:A,protect:B,private:C
void test02(){
Te2 t;
//t.A=200;//报错
//t.B=300;//报错
//t.C=400;//报错
}
//继承private方式,权限变化:private:A,private:B,private:C
void test03(){
Te3 t;
//t.A=200;//报错
//t.B=300;//报错
//t.C=400;//报错
}
总结:
子类对象可以直接访问到子类中同名成员
子类对象加作用域可以访问到父类同名成员:s.m_A -> 加父类作用域 s.Base::m_A
当子类和父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数
- 2.多继承
语法:class 子类:继承方式 父类1, 继承方式 父类2 ...
class Son:public Base1,public Base2{
}
动物
羊
驼
羊驼
cl /d1 reportSingleClassLayoutSheepTuo "08 菱形继承.cpp"
解决菱形继承出现的多个开销问题,用虚继承
class Sheep :virtual public Animal{}
- 3.多态
早绑定和晚绑定,就是不加virtual和加入virtual的区别
在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容
故,可以将虚函数改为纯虚函数
语法:
virtual 返回值类型 函数名 (参数列表) = 0;
virtual void func() = 0;
当类中有了虚函数,这个类也称为抽象类
- 4.创建
class Base{
}
//栈区创建
Base b ;
//堆区创建
new Base;
string *m_Name;
- 5.虚析构和纯虚析构
//虚析构
virtual ~Animal(){
cout<<"Animal 虚析构函数调用"<<endl;
}
//纯虚虚构
virtual ~Animal()=0;
总结:
1)虚析构或纯虚析构就是用来解决通过父类指针释放子类对象
2)如果子类中没有堆区数据,可以不写为虚析构或纯虚析构
3)拥有纯虚析构函数的类也属于抽象类
6.写文件
用二进制方式写文件ios::binary | ios ::out
//1.包含有文件 fstream
//2.创建流对象
ofstream ofs;
//3.指定打开方式
ofs.open("test.txt", ios::out);
//4.写内容
ofs << "姓名:张三" << endl;
ofs << "性别:男" << endl;
ofs << "年龄:18" << endl;
//5.关闭文件
ofs.close();
7.读文件
#include <fstream>
void test61(){
ifstream ifs;
ifs.open("test.txt",ios::in);
if(!ifs.is_open()){
cout<<"读取失败"<<endl;
}
while(ifs>>buf){
cout<<buf<<endl;
}
}
int main(){
test61();
return 0;
}
总结:
1)读文件可以利用ifstream,或者fstream
2)利用is_open()函数可以判断文件是否打开成功
3)close关闭文件
8.模板
1)template<typename T>
void mySwap(T &a,T &b){
T temp = a;
a=b;
b=temp;
}
2)template<class T>
void test(){
}
void test1(){
int a=10;
int b=20;
mySwap(a,b);//隐式
mySwap<int>(a,b);//显示
}
普通函数和与函数模板区别:
当普通函数调用时可以发生自动类型转换(隐式类型转换)
函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
如果利用显示指定类型的方式,可以发生隐式类型转换
总结:建议使用显示类型指定的方式,调用函数模板,因为可以自己确定通用类型T