首页 > 编程语言 >C++(虚函数和纯虚函数的区别)

C++(虚函数和纯虚函数的区别)

时间:2023-12-18 10:12:12浏览次数:34  
标签:函数 实现 提供 派生类 C++ 纯虚 基类

在 C++ 中,虚函数和纯虚函数都与面向对象编程中的多态性相关,但它们有一些关键的区别。

虚函数(Virtual Function):

  1. 定义:虚函数是在基类中声明并在派生类中定义的函数,使用 virtual 关键字进行声明。在基类中可以提供一个默认实现,但在派生类中可以选择覆盖(override)它。

  2. 实现:虚函数可以在基类中包含实现,但这个实现可以被派生类覆盖。如果派生类没有提供自己的实现,将使用基类的默认实现。

  3. 派生类的选择:派生类可以选择性地覆盖虚函数。如果不覆盖,将使用基类的实现。

  4. 示例

    class Base {
    public:
        virtual void print() {
            std::cout << "Base class print function" << std::endl;
        }
    };
    
    class Derived : public Base {
    public:
        void print() override {
            std::cout << "Derived class print function" << std::endl;
        }
    };
    

纯虚函数(Pure Virtual Function):

  1. 定义:纯虚函数是在基类中声明但没有提供实现的虚函数,使用 virtual 关键字和 = 0 进行声明。纯虚函数必须在派生类中被实现。

  2. 实现:纯虚函数在基类中没有提供实现,它是抽象的,必须由派生类提供实际的实现。

  3. 派生类的强制实现:派生类必须提供纯虚函数的实现,否则该派生类也会成为抽象类。

  4. 示例

    class AbstractBase {
    public:
        virtual void pureVirtualFunction() = 0;
    };
    
    class ConcreteDerived : public AbstractBase {
    public:
        void pureVirtualFunction() override {
            std::cout << "ConcreteDerived class implements pure virtual function" << std::endl;
        }
    };
    

总结区别:

  • 实现有无:虚函数可以在基类中提供实现,而纯虚函数在基类中没有提供实现。
  • 是否强制实现:纯虚函数要求派生类必须提供实现,否则它也会成为抽象类,而虚函数允许派生类选择是否覆盖。
  • 实例化对象:纯虚函数的类不能实例化对象,而虚函数的类可以实例化对象。

在实际应用中,虚函数和纯虚函数的选择取决于设计的目标。使用虚函数时,可以提供基类的默认实现,而纯虚函数则用于强制派生类提供特定的实现。



标签:函数,实现,提供,派生类,C++,纯虚,基类
From: https://www.cnblogs.com/keye/p/17910415.html

相关文章

  • 群智能优化算法测试函数matlab源代码
    globalM;creatematrix(2);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%画ackley图。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ackleyxfrom[-55]%x=-5:0.01:5;%[x,y]=meshgrid(x);%temp1=x.^2+y.^2;%temp2=cos(2*pi*x)+cos(2*pi*y);%z=20+exp(1)-20*exp(-0.2*sqrt(te......
  • C++调用opencv使用透明遮罩进行模板匹配定位——以梦幻西游鼠标为例
    目录程序简介程序/数据集下载代码分析程序简介项目调用C++的opencv模块进行模板匹配,即在一张源图上找到对应模板图最相似的位置,网上大多数使用matchTemplate方法并没有使用到mask遮罩(也可以叫掩膜),而在现实情况中不规则的模板更为常见,而模板加遮罩则可以实现不规则模板,本文以梦......
  • python网站创建011:函数、序列化
    经典函数:JS经典函数定义function函数名(a1,a2){vara3=a1+a2returna3}varres=函数名(11,22)console.log(res) 那如何在浏览器中查看打印结果呢?  匿名函数:没名字的函数,如果只有一个地方用到,则直接使用......
  • 多工作表数据去重,VSTACK与UNIQUE函数发挥作用!
    1职场实例小伙伴们大家好,今天我们来继续学习Excel在职场办公中的应用案例:如何提取多个工作表中指定区域内的不重复值?这个问题实质是一个删除重复值保留唯一值的问题,但是涉及到了在多个工作表中的操作,显得不是那么的有思路。但是我们运用两个新函数VSTACK函数与UNIQUE函数就可以很轻......
  • ROW_NUMBER 开窗函数优化方案(Oracle && PostgreSQL 性能比对)
    帮朋友优化一条很简单的窗口函数ROW_NUMBER()OVER(),Oracle迁移PostgreSQL项目。原始SQL和执行计划STUDENT_BAK表我模拟的数据,3千万行数据。SELECTSTU_ID,STU_NAME,STU_SEX,STU_AGE,STU_DATE,STU_CLASSID,STU_SALFROM(SELECTSB.*, ROW_NUMBER()OVER(P......
  • 60道C++STL高频题整理(附答案背诵版)
    1.请解释vector容器和它的特点。在C++中,vector是标准模板库(STL)的一部分,它是一个动态数组。与普通数组相比,它的大小可以在运行时动态改变。下面是vector的一些主要特点和应用场景:动态大小:与传统的数组不同,vector可以根据需要动态地扩展或缩减大小。这意味着你不需要事先知道数......
  • 无涯教程-Java - String toUpperCase()函数
    将字符串转成大写字母,这等效于调用toUpperCase(Locale.getDefault())。StringtoUpperCase()-语法publicStringtoUpperCase()StringtoUpperCase()-返回值它返回字符串,并转换为大写。StringtoUpperCase()-示例importjava.io.*;publicclassTest{publics......
  • C++ 基础高频题整理(附答案背诵版)
    1.C和C++有什么区别?C++是C语言的超集(我看网上很多文章说这是不对的),这意味着几乎所有的C程序都可以在C++编译器中编译和运行。然而,C++引入了许多新的概念和特性,使得两种语言在一些关键点上有显著的区别。以下是C和C++的一些主要区别:面向对象编程:C++支持面向对象编程(OOP),包括类......
  • 无涯教程-Java - String toString()函数
    此方法将自身返回一个字符串。StringtoString()-语法publicStringtoString()StringtoString()-返回值此方法返回字符串本身。StringtoString()-示例importjava.io.*;publicclassTest{publicstaticvoidmain(Stringargs[]){StringStr=newS......
  • 无涯教程-Java - String toLowerCase(Locale locale)函数
    如果指定Locale则根据Locale将此String中的所有字符转换为小写,否则调用toLowerCase(Locale.getDefault())默认方法。StringtoLowerCase-语法publicStringtoLowerCase(Localelocale)StringtoLowerCase-返回值它返回转换为小写字母的字符串。StringtoLowerCase-示......