首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

纯虚函数可能没有内联定义.为什么?

纯虚函数是在基类中声明的虚函数,但没有给出具体的实现。它的目的是为了让派生类必须实现这个函数,以便在多态的情况下能够正确调用。

由于纯虚函数没有具体的实现,所以它没有内联定义。内联函数是在编译时将函数的代码插入到调用处,以减少函数调用的开销。但是纯虚函数没有具体的实现,编译器无法将其代码插入到调用处,因此无法进行内联。

纯虚函数通常用于定义接口,它只有函数的声明,没有函数体。派生类必须实现这个函数,才能被实例化和调用。这样可以实现多态性,让不同的派生类对象能够以相同的接口进行操作。

纯虚函数的优势在于它能够定义一组接口规范,让派生类按照这些规范进行实现,提高了代码的可维护性和可扩展性。它常用于设计模式中的抽象基类和接口类的定义。

在腾讯云的产品中,与纯虚函数相关的概念是函数计算(Serverless)服务。函数计算是一种无需管理服务器和运行环境的计算服务,开发者只需编写函数代码并设置触发条件,即可实现按需运行和弹性扩缩容。函数计算可以用于处理各种事件驱动的任务,如数据处理、消息推送、定时任务等。您可以通过腾讯云函数计算产品了解更多信息:腾讯云函数计算

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++】多态 ⑧ ( 验证指向 函数表 的 vptr 指针 | 对比定义函数的类和没有定义函数类的大小 )

对比 定义函数 的类 与 没有定义函数的类 的大小 , 其它成员都相同 , 定义函数的类多出了 4 字节 , 多出的 4 字节就是 vptr 指针占用的内存空间 ; 一、验证指向 函数表...1 个函数 ; 如果 没有函数 , 就不会生成函数表 ; 如果 类 中有 virtual 函数 , 则 该类的 每个对象 中 , 都有一个 指向 函数表的 vptr 指针 ; 函数表 存储...; 2、函数类与普通函数类对比 - 多出了 vptr 指针的大小 下面的代码中 , 定义了 2 个类 , 区别是 一个定义了 virtual 函数 , 另外一个没有定义 函数 ; 在 Parent...中定义函数 virtual void fun(int a) ; 在 Parent2 中定义的是 普通函数 void fun(int a) ; 使用 sizeof 函数 , 获取这两个类的大小 ,...判断两个类的区别 ; 最终得到 , 有 函数 的 类 , 比 没有 函数 的 类 , 多 4 字节 , 也就是一个指针的大小 , 定义函数 的类 , 多出的 4 字节就是 vptr 指针的大小

21240

【C++】内联函数 ④ ( C++ 编译优化 - 没有 inline 关键字修饰的函数可能内联 | C++ 编译器内联限制 | 内联失败的几种情况 )

一、C++ 编译优化 - 没有 inline 关键字修饰的函数可能内联 1、函数内联的不确定性 现在的 C++ 编译器能够进行编译优化 , 使用了 inline 声明的 内联函数 , 编译器 可能不会允许该函数...进行内联 ; 没有使用 inline 声明的 普通函数 , 如果频繁调用 , 编译器 可能会为了提高执行效率 , 将其内联 ; 内联函数的不确定性 : 编译器内联函数是基于 编译器的优化策略和代码的特性..., 内联成功可能会增加代码的大小 , 也可能会导致程序运行速度变慢 ; 可以通过设置调整 C++ 编译器 的参数 和 优化级别 , 优化编译后的程序运行效果 ; 3、内联优化细节 即使没有使用inline...; 编译器在决定是否内联函数时 , 会考虑函数的复杂性 , 大小和调用次数等因素 ; 如果 函数比较简单 且被频繁调用 , 编译器可能会选择将其内联 , 以提高程序的执行效率 ; 二、C++ 编译器内联限制..., 内联直接失败 ; 内联函数声明在调用之后 : 由于内联函数不能进行声明操作 , 内联函数的声明与定义必须在一起 , 如果内联函数调用在声明定义之前 , 说明该内联函数进行了单独的声明 , 该函数内联一定会失败

30330
  • 构造函数为什么一般不定义函数?而析构函数一般写成函数的原因 ?

    浏览量 3 1、构造函数不能声明为函数 1)因为创建一个对象时需要确定对象的类型,而函数是在运行时确定其类型的。...而在构造一个对象时,由于对象还未创建成功,编译器无法知道对象的实际类型,是类本身还是类的派生类等等 2)函数的调用需要函数表指针,而该指针存放在对象的内存空间中;若构造函数声明为函数,那么由于对象还未创建...,还没有内存空间,更没有函数表地址用来调用函数即构造函数了 2、析构函数最好声明为函数,首先析构函数可以为函数,当析构一个指向派生类的基类指针时,最好将基类的析构函数声明为函数,否则可以存在内存泄露的问题...如果析构函数不被声明成函数,则编译器实施静态绑定,在删除指向派生类的基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。子类析构时,要调用父类的析构函数吗?...析构函数调用的次序时先派生类后基类的。和构造函数的执行顺序相反。并且析构函数要是virtual的,否则如果用父类的指针指向子类对象的时候,析构函数静态绑定,不会调用子类的析构。

    64310

    【C++】继承和多态高频面试题整理

    以下关于函数的说法,正确的是( ) A:声明函数的类不能实例化对象 B:声明函数的类是基类 C:子类必须实现基类的函数 D:函数必须是空函数 答案:A 关于函数的描述正确的是...( ) A:派生类的函数与基类的函数具有不同的参数个数和类型 B:内联函数不能是函数(可以认为语法上可以) C:派生类必须重新定义基类的函数 D:函数可以是一个static型的函数 答案...答案:D 假设A类中有函数,B继承自A,B重写A中的函数,也没有定义任何函数,则( ) A:A类对象的前4个字节存储表地址,B类对象前4个字节不是表地址 B:A类对象和B类对象前4个字节存储的都是基表的地址...以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,用函数体替换函数的调用,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。...那这样的话,如果一个内联函数真的被处理成内联函数的话,它是没有地址的,那没有地址的函数能是函数吗? 肯定是不行的,因为函数必须有地址,而且地址要放进函数表里面。

    27310

    CC++面试常问题集(2)

    8、哪些函数不能声明成函数? 在C++,有五种函数不能被声明成函数,分别是:非成员函数、构造函数、静态成员函数内联成员函数、友元函数这五种,下面分别解释为什么这五种函数不能被声明成函数。...内联成员函数  内联函数是为了在代码中直接展开,减少函数调用花费的代价,并且inline函数在编译时被展开,函数是为了实现多态,是在运行时绑定的。因此显然内联函数和多态的特性相违背。 5....友元函数  友元函数不属于类的成员函数,不能被继承。对于没有继承特性的函数没有函数的说法。 9、多态,函数函数?...函数 函数声明的时候=0 没有方法实体的是函数 当类中有一个函数,这个类也称为抽象类。 抽象类特点: 无法实例化对象。...子类必须重写抽象类中的函数,否则子类也属于抽象类,也无法实例化对象。 image.png 接口类 概念:仅含有函数的类称为接口类。 没有任何数据成员,只有成员函数,而且成员函数都是函数

    1.2K10

    virtual

    构造函数不能是函数,否则会造成编译错误 内联函数不能是函数,如果内联函数被virtual修饰,计算机会忽略inline使之变成函数。...这也很自然的解释了为什么函数不能通过返回值不同来重载,因为程序在调用函数时很有可能不关心返回值,编译器就无法从代码中看书程序在调用的是哪个函数。...//////// } virtual double calcPerimeter() = 0;//函数 ////函数没有函数体,同时在定义的时候函数名后腰加...当实例化一个该类的子类对象的时候,如果该类的子类没有定义函数,但是却从父类中继承了函数,所以在实例化该类子类对象的时候也会产生一个函数表,这个函数表是子类的函数表,但是记录的子类的函数地址却是与父类是一样的...哪怕类中只有一个函数,那么这个类也是一个抽象类,函数没有函数体,所以抽象类不允许实例化对象,抽象类的子类也可以是一个抽象类。

    65950

    字节客户端也疯狂拷打基础!

    这些字节没有实际的意义,只是为了满足内存对齐的要求。 为什么要字节对齐?...有哪些应用场景 函数是在基类中声明的函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。...在C++中,函数的声明形式如下: virtual void function() = 0; 其中,= 0就表示这是一个函数。 含有函数的类被称为抽象类。...派生类必须实现所有的函数,否则该派生类也会变成抽象类。 函数的应用场景主要包括: 设计模式:例如在模板方法模式中,基类定义一个算法的骨架,而将一些步骤延迟到子类中。...这些需要在子类中实现的步骤就可以声明为函数。 接口定义:可以创建一个只包含函数的抽象类作为接口。所有实现该接口的类都必须提供这些函数的实现。 为什么一般将析构函数设置为函数

    29130

    什么?CC++面试过不了?因为你还没看过这个!

    递归、switch 等复杂操作的内联函数; 在类声明中定义函数,除了函数的其他函数都会自动隐式地当成内联函数。...内联函数相比宏函数来说,在代码展开时,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。 在类中声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问类的成员变量,宏定义则不能。...内联函数在运行时可调试,而宏定义不可以。 函数(virtual)可以是内联函数(inline)吗?...shape1 = NULL; return 0; } 函数 函数是一种特殊的函数,在基类中不能对函数给出有意义的实现,而把它声明为函数,它的实现留给该基类的派生类去做。...函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。 函数在子类里面可以不重写;但函数必须在子类实现才可以实例化子类。

    3.7K50

    C语言与C++面试知识总结

    、递归、switch 等复杂操作的内联函数; 在类声明中定义函数,除了函数的其他函数都会自动隐式地当成内联函数。...内联函数相比宏函数来说,在代码展开时,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。 在类中声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问类的成员变量,宏定义则不能。...内联函数在运行时可调试,而宏定义不可以。 函数(virtual)可以是内联函数(inline)吗?...shape1 = NULL; return 0; } 函数 函数是一种特殊的函数,在基类中不能对函数给出有意义的实现,而把它声明为函数,它的实现留给该基类的派生类去做。...函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。 函数在子类里面可以不重写;但函数必须在子类实现才可以实例化子类。

    5K41

    C++多态

    override: 检查派生类函数是否重写了基类某个函数,如果没有重写编译报错。 重载、覆盖(重写)、隐藏(重定义)的对比 抽象类 在函数的后面写上 =0 ,则这个函数函数。...函数规范了派生类必须重写,另外函数更体现出了接口继承。...就是重载和函数的重写。 2.内联函数能不能是函数呢?...语法上来说是可以的,但是其实是并不行的,因为inline关键字只是提出一个建议,到底需不需要去变成内联函数是要看实际情况的,如果将函数变成内联函数没有办法放进表里面的,编译器就忽略inline属性...也就是说,如果是多态调用就没有内联属性,但是普通调用可以继续保持内联属性。 3.为什么父类的对象无法完成多态调用呢?

    28290

    c++ 深入理解函数

    为什么使用函数?什么是函数函数是为了解决什么问题?...内联函数不能是函数 如果修饰内联函数 如果内联函数被virtual修饰,计算机会忽略inline使它变成存粹的函数。 构造函数不能是函数,否则会出现编译错误。...当实例化一个该类的子类对象的时候,(如果)该类的子类并没有定义函数,但是却从父类中继承了函数,所以在实例化该类子类对象的时候也会产生一个函数表,这个函数表是子类的函数表,但是记录的子类的函数地址却是与父类的是一样的...virtual double calcPerimeter()=0;//函数 7 .... 8 }; 函数没有函数体,同时在定义的时候函数名后面要加“=0”。...哪怕只有一个函数,那么这个类也是一个抽象类,函数没有函数体,所以抽象类不允许实例化对象,抽象类的子类也可以是一个抽象类。抽象类子类只有把抽象类当中的所有的函数都做了实现才可以实例化对象。

    1.6K60

    【多态】【表指针与表】【多继承中的多态】

    inline内联函数 是可以用 virtual 修饰的,只不过一旦修饰后,内联函数的功能就取消了。...(因为内联函数没有地址的,但是若修饰为 virtual 是需要地址的,所以内联函数相当于变成了普通的成员函数) 构造函数不能是函数,因为定义函数是为了构成多态,多态调用要去对象的表中找到函数,...这也是为什么编译器要将析构函数统一处理为 destructor() 的原因,因为这样子他们的函数名就相同了,且都是没有返回值,也没用参数,也就构成了重写的条件!...函数还是保持了函数的特性,可以通过父类的指针或者引用完成多态行为。 对于抽象类,当我们定义派生类的对象时候,也会去调用抽象类的构造函数。 若子类没有重写函数,则子类也无法实例化出对象。...为什么? 运行结果: 12 我们通过定义一个基类 Base 的对象,通过监视窗口来看看是什么情况: Base b; 咦,很奇怪是不是?

    1.2K30

    闭关多日,整理一份C++中那些重要又容易忽视的细节

    运算符重载 面试题:C++类自动提供的成员函数 基类为什么需要析构函数?...内联函数则提供了另一种可能,对于内联函数,编译器在编译的时候直接在调用处将函数展开,嵌入到调用函数中,所以无需反复横跳,减少了时间的开销,但是,增加了空间的开销。...---- 基类为什么需要析构函数?...直接来个示例看一下吧: class test{ public: virtual ~test() = 0; // 声明一个析构函数 }; 防止内存泄露,定义一个基类的指针p,在delete p时,如果基类的析构函数函数...如果派生类提供了函数的新定义,该函数表将保存新函数的地址;如果派生类没有重新定义函数,该vtbl将保存函数原始版本的地址。如果派生类定义了新的函数,则该函数也将被添加到vtbl中。

    59310

    总结继承和多态的一些问题

    切片: 我们都知道,多态的的条件是函数的重写和必须通过基类的指针或者引用调用函数。。那么为什么一定是需要基类的指针或引用呢? 先来看看不用指针或引用,也就是使用基类对象来调用函数。...基类原本的表里面都没有派生类重写的函数的地址,还要怎么构成多态?...内联函数可以写成函数,不过写出函数后,这个内联函数就不是内联函数了。 6.静态成员可以是函数吗?...不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方式无法访问函数表,所以静态成员函数无法放进函数表。 7.析构函数可以函数吗? 基类的析构函数最好是函数。...另外,函数可以有函数实体,但是没必要。 抽象类的作用是强制重写函数。另外抽象类体现出了接口继承关系 大家如果还有什么问题需要补充的话可以评论告诉我哦!

    45420

    轻松搞定面试中的“

    包括:函数函数基类,继承... 1.什么是函数,有什么作用? 在基类用virtual声明成员函数函数。这样就可以在派生类中重新定义函数,为它赋予新的功能,并能方便地被调用。...函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数,达到多态的目的。 2.什么是函数,什么是类,有什么作用?...函数只有函数的名字而不具备函数的功能,不能被调用。它只是通知编译系统:“在这里声明一个函数,留待派生类中定义”。在派生类中对此函数提供定义后,它才能具备函数的功能,可被调用。...因为函数是不能被调用的,包含函数的类是无法建立对象的。 抽象类的作用是作为一个类族的共同基类,或者说,为一个类族提供一个公共接口。 3.为什么有的类的析构函数需要设为virtual?...所以,只有当一个类被用来作为基类的时候,才把析构函数写成函数。 可以。 4.析构函数是否可以是函数? 可以,当需要定义一个抽象类,如果其中没有其他合适的函数,可以把析构函数定义的。

    67620

    多态

    多态的定义及实现 多态是类继承时,对象去调用同一个对象产生不同的行为 要构成多态的条件有两个 函数的重写 基类的对象或引用调用函数 函数的重写 什么是函数?...:修饰函数,表示该函数不能被重写 override:检查派生类中函数没有被重写,没有被重写就会报错 抽象类 包含函数的类,叫做抽象类。...函数——函数后面加上一个=0 抽象类就是抽象,即**不能实例化出来对象。**派生类继承了也不能实例化出来对象,必要要进行重写,才能实例化出来对象。...,目的是为了重写,接口继承就是函数的声明继承下来,定义不继承,会重写定义。...inline可以是函数,inline只是建议编译器把函数当作内联函数,但是,内联函数在编译的时候就展开了,没有函数栈帧的开辟,而函数在要在运行的时候去函数表中去早该函数的地址。

    25620

    lnk2001 lnk1120_lnk1120

    2.如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定义将导致LNK2001错误。   3.调用函数时如果所用的参数类型同函数声明时的类型不符将会产生LNK2001。   ...6.当在基类中创建了函数没有在基类中对函数做具体的实现时将会产生LNK2001错误。解决办法是:①、将该函数定义函数。②、在基类中对该函数做具体实现。   ...6.不同版本的库和编译器的混合使用也能产生问题,因为新版的库里可能包含早先的版本没有的符号和说明。   7.在不同的模块使用内联和非内联的编译选项能够导致LNK2001。...如果创建C++库时打开了函数内联(/Ob1或/Ob2),但是在描述该函数的相应头文件里却关闭了函数内联没有inline关键字),这时将得到该错误信息。...若要生成一个 MSIL 可执行文件(不与 CRT 链接),则必须在项目中定义函数,而不能使用 nochkclr.obj(.obj 是本机代码)。

    1K20

    网易内推(C++C研发)offer之路

    (静态和动态,然后分别叙述了一下函数函数重载) (2) 动态绑定怎么实现?(就是问了一下基类与派生类指针和引用的转换问题) (3) 类型转换有哪些?...(就是四种情况说了一下) (8) 函数函数函数与析构函数?...(函数如何定义为什么析构函数定义函数) (9) 内联函数(讲了一下内联函数的优点以及和宏定义的区别) (10) const和typedef(主要讲了const的用处,有那些优点) (11...(10) 函数函数表里面内存如何分配?(这个考前看过了,答的还不错) (11) 如何实现只能动态分配类对象,不能定义类对象?...(13) 红黑树的定义和解释? (14) const关键字的作用?(const成员函数函数传递,和define的区别) (15) 静态成员函数和数据成员有什么意义?

    92090

    C++【多态】

    ,修饰后,父类不可被继承 注:final 可以修饰子类的函数,因为子类也有可能成为父类;但 override 无法修饰父类的函数,因为父类之上没有父类了,自然无法构成重写 2.4、重载、重写、重定义...当然不是,抽象类是一种极其特殊的类:不允许实例化对象 什么年代了还下传统围棋~ 3.1、定义与特点 如何实现一个抽象类:在函数之后加上 =0,此时函数升级为 函数 函数也可以与普通函数构成重写...,在不被重写的情况下,构成重定义,父类同名函数被隐藏 重载可以出现任何位置,只要函数在同一作用域中,而重定义是重写的基础,或者是重写包含重定义,假设因为没有 virtual 修饰不构成重写,那么必然构成重定义...,重写和重定义只能发生在继承关系中 4.为什么内联修饰可以构成多态?...不同环境下结果可能不同 内联对编译器只是建议,当编译器识别为函数时,会忽略 inline 5.静态成员函数为什么不能构成多态?

    14030

    Google C++编程风格指南(四)之类的相关规范

    定义:新建一个没有参数的对象时,默认构造函数被调用,当调用new[](为数组)时,默认构造函数总是被调用。 优点:默认将结构体初始化为“不可能的”值,使调试更加容易。...定义:当一个类满足以下要求时,称之为接口: 1) 只有函数(”=0”)和静态函数(下文提到的析构函数除外); 2) 没有非静态数据成员; 3) 没有定义任何构造函数。...接口类不能被直接实例化,因为它声明了函数。为确保接口类的所有实现可被正确销毁,必须为之声明析构函数。...参考拷贝构造函数。 .cc文件中函数定义应尽可能和声明次序一致。 不要将大型函数内联到类的定义中,通常,只有那些没有特别意义的或者性能要求高的,并且是比较短小的函数才被定义内联函数。...为后缀,除提供带实现的析构函数、静态成员函数外,其他均为函数,不定义非静态数据成员,不提供构造函数,提供的话,声明为protected; 为降低复杂性,尽量不重载操作符,模板、标准类中使用时提供文档说明

    87421
    领券