c++学习之路4

本文深入讲解了C++中的继承概念,包括公共继承、保护继承和私有继承的权限变化,并举例说明了子类如何访问父类成员。此外,还探讨了多态性,包括早绑定和晚绑定的区别,以及虚函数和纯虚函数的应用。同时,介绍了文件操作的基本步骤,如写入和读取文件。最后,提到了模板的使用及其与普通函数的区别,强调了显示类型指定的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值