C++ 59 之 纯虚函数和抽象类

2024-06-16 13:20
文章标签 c++ 函数 抽象类 59 纯虚

本文主要是介绍C++ 59 之 纯虚函数和抽象类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include <iostream>
#include <string>
using namespace std;class Cal { // 类中有纯虚函数,这个类也叫做抽象类,无法实现实例化
public:int m_a;int m_b;// 虚函数// virtual int getRes(){//     return 0;// }// 纯虚函数 作用和虚函数一样,实现 多态virtual int getRes() = 0;
};// 加法  子类要重写父类的虚函数
class Add : public Cal {
public:virtual int getRes(){ // virtual可以省略不写return m_a + m_b;}
};// 减法
class Sub : public Cal {
public:int getRes(){return m_a - m_b;}
};
// 抽象类的子类务必要重写父类中的纯虚函数,否则也属于抽象类,无法实现实例化
class Test : public Cal { // 没有重写父类纯虚函数
public:};int main()
{// 多态可以改善代码的可读性和组织性,同时也可以让程序具有可扩展性// 动态多态产生条件:// 1.要有继承关系// 2.父类中有虚函数、子类要重写父类的虚函数// 3.父类的指针或引用指向子类的对象// 加法:写法1 指针 // Cal* c1 = new Add;  // 函数名一样,但对象不一样,就执行不同对象里的函数 多态// c1->m_a = 1;// c1->m_b = 2;// cout << c1->getRes() << endl;// delete c1;// c1 = NULL;// 减法:写法1 指针// Cal* c1 = new Sub;// c1->m_a = 1;// c1->m_b = 2;// cout << c1->getRes() << endl;// delete c1;// c1 = NULL;// 加法:写法2 引用Add a1;Cal& c1 = a1;c1.m_a = 1;c1.m_b = 2;cout << c1.getRes() << endl;// 减法:写法2 引用Sub s1;Cal& c2 = s1;c2.m_a = 1;c2.m_b = 2;cout << c2.getRes() << endl;// 抽象类的子类务必重写父类中的纯虚函数,否则也属于抽象类,无法实现实例化// Test t1;// 类中有纯虚函数,这个类也叫抽象类,无法实现实例化// Cal c1;return 0;
}

 

抽象基类和纯虚函数(pure virtual function)

在设计时,常常希望基类仅仅作为其派生类的一个接口。这就是说,仅想对基类进行向上类型转换,使用它的接口,而不希望用户实际的创建一个基类的对象。同时创建一个纯虚函数允许接口中放置成员原函数,而不一定要提供一段可能对这个函数毫无意义的代码。

做到这点,可以在基类中加入至少一个纯虚函数(pure virtual function),使得基类称为抽象类(abstract class).

  1. 纯虚函数使用关键字virtual,并在其后面加上=0。如果试图去实例化一个抽象类,编译器则会阻止这种操作。
  2. 当继承一个抽象类的时候,必须实现所有的纯虚函数,否则由抽象类派生的类也是一个抽象类。

这篇关于C++ 59 之 纯虚函数和抽象类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1066567

相关文章

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基