当前位置: 首页 > news >正文

C++ 类的学习(六) 虚函数

虚函数


类的指针

class CBox                             //基类
{
public:// 输出体积void showVolume() const{std::cout << "CBox usable volume is " << volume() << std::endl;}// 计算体积(虚函数)virtual double volume() const{return m_Length*m_Width*m_Height;}// 构造函数explicit CBox(double lv = 1.0, double wv = 1.0, double hv = 1.0) :m_Length{ lv }, m_Width{ wv }, m_Height{ hv } {}protected:double m_Length;double m_Width;double m_Height;
};class CGlassBox : public CBox           // 派生类
{
public:// 计算体积(override重写)virtual double volume() const override{return 0.85*m_Length*m_Width*m_Height;}// 构造函数CGlassBox(double lv, double wv, double hv) : CBox{ lv, wv, hv } {}
};int main()
{CBox myBox{ 2.0, 3.0, 4.0 };            // 实例化一定基类CGlassBox myGlassBox{ 2.0, 3.0, 4.0 };  // 实例化一个派生类CBox* pBox{};                           // 基类指针pBox = &myBox;                          // 指针指向基类pBox->showVolume();                     // 显示体积pBox = &myGlassBox;                     // 指针指向派生类pBox->showVolume();                     // 显示体积return 0;
}


使用引用处理虚函数

class CBox                             //基类
{
public:// 输出体积void showVolume() const{std::cout << "CBox usable volume is " << volume() << std::endl;}// 计算体积(虚函数)virtual double volume() const{return m_Length*m_Width*m_Height;}// 构造函数explicit CBox(double lv = 1.0, double wv = 1.0, double hv = 1.0) :m_Length{ lv }, m_Width{ wv }, m_Height{ hv } {}protected:double m_Length;double m_Width;double m_Height;
};class CGlassBox : public CBox           // 派生类
{
public:// 计算体积(override重写)virtual double volume() const override{return 0.85*m_Length*m_Width*m_Height;}// 构造函数CGlassBox(double lv, double wv, double hv) : CBox{ lv, wv, hv } {}
};//形参为基类,传递派生类时,会选择派生类的虚函数
void output(const CBox& aBox)
{aBox.showVolume();
}int main()
{CBox myBox{ 2.0, 3.0, 4.0 };           // 实例化一个基类CGlassBox myGlassBox{ 2.0, 3.0, 4.0 }; // 实例化一个派生类output(myBox);                         // 输出基类output(myGlassBox);                    // 输出派生类return 0;
}

纯虚函数


抽象类

抽象类不能实例化

可以使用抽象类的指针和引用

class CContainer        
{
public: virtual double volume() const = 0;// =0表示纯虚函数// 输出体积virtual void showVolume() const{std::cout << "Volume is " << volume() << std::endl;}
};

间接基类


虚析构函数

class CContainer        // 抽象类
{
public://抽象类virtual double volume() const = 0;//虚函数virtual void showVolume() const{std::cout << "Volume is " << volume() << std::endl;}//  virtual ~CContainer()           // Comment out the next line and uncomment this for correct operation~CContainer(){std::cout << "CContainer destructor called" << std::endl;}
};class CCan : public CContainer
{
public://虚函数virtual double volume() const override{return 0.25*M_PI*m_Diameter*m_Diameter*m_Height;}// Constructorexplicit CCan(double hv = 4.0, double dv = 2.0) : m_Height{ hv }, m_Diameter{ dv } {}~CCan(){std::cout << "CCan destructor called" << std::endl;}protected:double m_Height;double m_Diameter;
};class CBox : public CContainer          // Derived class
{
public://虚函数virtual void showVolume() const override{std::cout << "CBox usable volume is " << volume() << std::endl;}//虚函数virtual double volume() const override{return m_Length*m_Width*m_Height;}// Constructorexplicit CBox(double lv = 1.0, double wv = 1.0, double hv = 1.0):m_Length{ lv }, m_Width{ wv }, m_Height{ hv } {}~CBox(){std::cout << "CBox destructor called" << std::endl;}protected:double m_Length;double m_Width;double m_Height;
};class CGlassBox : public CBox           // Derived class
{
public://虚函数virtual double volume() const override{return 0.85*m_Length*m_Width*m_Height;}~CGlassBox(){std::cout << "CGlassBox destructor called" << std::endl;}// ConstructorCGlassBox(double lv, double wv, double hv) : CBox{ lv, wv, hv } {}
};int main()
{CContainer* pC1{ new CBox{ 2.0, 3.0, 4.0 } }; //基类CCan myCan{ 6.5, 3.0 };    //直接派生类CGlassBox myGlassBox{ 2.0, 3.0, 4.0 }; //间接派生类pC1->showVolume();                       // 输出基类体积delete pC1;                              // Now clean up the free storepC1 = new CGlassBox{ 4.0, 5.0, 6.0 };     // Create CGlassBox dynamicallypC1->showVolume();                       // ...output its volume...std::cout << "Delete CGlassBox" << std::endl;delete pC1;                              // ...and delete itpC1 = &myCan;                            // 直接基类pC1->showVolume();                       // Output the volume of CCanpC1 = &myGlassBox;                       //间接基类pC1->showVolume();                       // Output the volume of CGlassBoxreturn 0;
}

http://www.dtcms.com/a/532416.html

相关文章:

  • leetcode 2043 简易银行系统
  • 网站插件代码怎么用哪个网站上做自媒体最好
  • 【LeetCode100】--- 97.多数元素【思维导图+复习回顾】
  • Wasserstein 距离简介
  • 南宁网站建设外包vs做的网站如何
  • 【C++】前缀和算法习题
  • GitHub等平台形成的开源文化正在重塑加特
  • 基于单片机的家庭防盗防火智能门窗报警系统设计
  • 响应式网站建设的未来发展网络规划与设计就业前景
  • 【图像处理】图像错切变换
  • Docker环境离线安装-linux服务器
  • 软件设计师知识点总结:结构化开发
  • 持续改变源于团队学习
  • Unity安装newtonsoft
  • Spring Boot3零基础教程,整合 Redis,笔记69
  • 凡科网站官网登录入口wordpress 列表模板
  • 读论文AI prompt
  • 《Ionic 平台:全面解析与深入探讨》
  • 网站做淘宝客有什么要求微网站的优势
  • FFmpeg 基本数据结构 AVStream分析
  • kafka数据同步一致性问题
  • 淘宝网站的建设内容网站建设的平台
  • Linux进程间通信:管道与System V IPC的全解析
  • 技术选型对比:几种主流方案获取淘宝商品实时数据的优劣分析
  • 想象力网站建设深圳市房地产信息系统平台
  • 让 Codex 用 React 生成一个博客首页
  • Kafka的概念
  • 开发实战 - ego商城 - 补充:小程序性能优化
  • 如何截取PDF内容为图片
  • 智慧景区导览小程序