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

C++笔记(五)--- 虚函数(virtual)

目录

虚函数介绍

虚函数、覆盖和重载区别


虚函数介绍

C++的虚函数是多态性的表现

1.构造函数不能为虚函数
2.子类继承时虚函数仍为虚函数
3.虚函数类外实现时,不需要加virtual
4.有虚函数的类,析构函数一定要写成虚函数(否则可能会造成内存泄漏)
5.纯虚函数不能实例化,子类必须实现父类虚函数,否则也不能实例化

class A
{
public:virtual A(){}    //报错:“A”:“inline”是构造函数的唯一合法存储类
}
class A
{
public:A(){ cout << "A() " << endl; }virtual void print(void) { cout << "A::print() " << endl; }
};class B : public A
{
public:B() { cout << "B() " << endl;}void print(void) { cout << " B::print() " << endl; }//虽然没有写virtual,但继承来自A,所以仍然为virtual。但强烈建议写上virtual
};class C : public B
{
public:C() { cout << "C() " << endl; }virtual void print(void);
}void C::print(void)    //类外实现函数体时不需要加 virtual
{cout << "C::print()!" << endl;
}int main(void)
{A *a = new C;a->print();    //打印 C::print()!return 0;
}
class A
{
public:A(){}virtual void print(void) = 0;
};class B : public A
{
public:B(){}
//此处没有对print进行实现
};int main()
{
//    A a;    //报错,“A”: 无法实例化抽象类
//    B b;    //报错,“B”: 无法实例化抽象类return 0;
}
class A
{
public:A() { cout << "A()" << endl;}virtual void print(void) { cout << "A::print()!" << endl; }~A() { cout << "~A()" << endl; }    //此处析构函数未声明为virtual
};class B : public A
{
public:B() { cout << "B()" << endl; }virtual void print(void) { cout << "B::print()" << endl; }~B() { cout << "~B()" << endl; }
};int main(void)
{A *a = new B;a->printf();delete a;    //注意看下面执行结果打印return 0;
}

执行结果如下,只执行了类A的析构函数,new出来的B的析构没有执行,内存泄漏

 

当A的析构函数声明为virtual,则先执行B的析构函数,在执行A的析构函数

虚函数、覆盖和重载区别

虚函数:父类某成员函数必须用virtual声明,子类重写的函数定义完全与父类相同(参数类型,参数个数和返回值),发生在父类和子类之间,父类可以调用子类的函数

覆盖:父类成员函数不用virtual声明,子类成员函数名称与父类相同(参数类型,参数个数和返回值可以不同),子类则完全覆盖父类所有相同名称的函数(即子类不能访问父类相同函数名称的函数)

重载:同一类的类成员函数之间,成员函数名称相同,但成员函数的参数类型、参数个数必须有至少一项不同

http://www.lryc.cn/news/309563.html

相关文章:

  • 编写加密程序,加密规则为:将所有字母转化为该字母后的第三个字母,即A->D、B->E
  • 【笔记】:更方便的将一个List中的数据传入另一个List中,避免多重循环
  • Cisco Secure ACS 5.8.0.32 安装 + Crack 教程
  • 项目准备March
  • 集智书童 | YOLO+混合注意力机制 | YOLOv5再加4.3%才可以做对手,Transformer混合设计依旧可以卷
  • Codeforces Round 894 (Div. 3)----->C. Flower City Fence
  • CryoEM - CryoAI: Amortized Inference of Poses 工程源码复现
  • 项目预备知识
  • redis实战笔记汇总
  • elment-ui table表格排序后 清除排序箭头/恢复默认排序 的高亮样式
  • MySQL数据库基本操作(二)
  • Unity(第十部)时间函数和文件函数
  • 【Java学习笔记】
  • Python列表生成式你学会了吗
  • 【Mybatis】快速入门 基本使用 第一期
  • 在 Rust 中实现 TCP : 1. 联通内核与用户空间的桥梁
  • STM32-ADC一步到位学习手册
  • 【文件管理】关于上传下载文件的设计
  • 微服务架构 SpringCloud
  • 前端 css 实现标签的效果
  • SLAM基础知识-卡尔曼滤波
  • 云时代【6】—— 镜像 与 容器
  • 【QT+QGIS跨平台编译】之五十三:【QGIS_CORE跨平台编译】—【qgssqlstatementparser.cpp生成】
  • JMeter性能测试基本过程及示例
  • 你知道什么是回调函数吗?
  • mac苹果电脑c盘满了如何清理内存?2024最新操作教程分享
  • k8s-kubeapps图形化管理 21
  • 1_Springboot(一)入门
  • Docker Machine简介
  • GWO优化高斯回归预测(matlab代码)