什么时候不能使用虚函数

类属static函数,构造函数s,inline函数(请参考《effective c++》p.136),模板成员函数不能virtual,这个比较麻烦,但是它也是由inline造成的,还有一个原因(详见《Think in C++》第二卷第五章),由于存在virtual成员模板函数,我们必须提前知道虚函数表的size大小,这就麻烦了。当然你可以理解为在编译时展开或者是替换的函数与virtual的运行时机制冲突

inline和virtual没关系,表乱讲的说。
加了inline并不代表函数一定要编译期展开,编译器不高兴可以不展;加了virtual不代表函数只能通过虚表间接调用,上下文确定了可以直接调。
inline是一个“建议”,你可以在一些确定没办法inline的函数上加inline修饰,但是编译器会忽略,比如说递归函数肯定没法inline,但是用inline定义的递归函数不是错误。
virtual是告诉编译器为这个函数生成虚表中的入口,但是并不代表调用这个函数必须通过这个入口,如果上下文确定,编译器完全可以跳过虚表直接调用,甚至内联展开,例如:

class A {
public:
    inline virtual void f() {}
};

int main() {
    A a;
    a.f();
}

像样一点的编译器都不会通过虚表调用f(),更像样一点的还会展开inline
准确的说,还有一种成员不能加virtual,那就是成员模板,例如:

class A {
    template<typename T>
    virtual void f(T t){}
};

这段程序就是错的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 13,161评论 1 51
  • 1. 让自己习惯C++ 条款01:视C++为一个语言联邦 为了更好的理解C++,我们将C++分解为四个主要次语言:...
    Mr希灵阅读 7,959评论 0 13
  • C++知识50问1、C和C++的区别?C++相对于C的优势。答:C是C++的基础,C++是C的超集。C是一个结构化...
    萌面大叔2阅读 3,649评论 0 26
  • 收集非原创文章,如遇原作者,请私聊我,我会表明出处! 1--10 1. C++中什么数据分配在栈或堆,静态存储区以...
    Juinjonn阅读 10,398评论 0 30
  • 题目类型 a.C++与C差异(1-18) 1.C和C++中struct有什么区别? C没有Protection行为...
    阿面a阅读 12,323评论 0 10

友情链接更多精彩内容