美文网首页
什么时候不能使用虚函数

什么时候不能使用虚函数

作者: 张霸天 | 来源:发表于2017-03-31 22:26 被阅读0次

类属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){}
};

这段程序就是错的

相关文章

  • linux c/c++面试知识点整理(八)

    71、能不能从构造函数调用虚函数,为什么? 可以的,只是虚函数会使用基类的虚函数。 72、什么时候可能会出现...

  • 什么时候不能使用虚函数

    类属static函数,构造函数s,inline函数(请参考《effective c++》p.136),模板成员函数...

  • 构造函数和析构函数可以是虚函数吗

    构造函数不能是虚函数,析构函数可以且常常是虚函数。 构造函数不能是虚函数 存储空间角度虚函数的调用需要 vptr ...

  • C++ - 纯虚函数与抽象类

    纯虚函数:没有函数体的虚函数 抽象类:包含纯虚函数的类只能作为基类来派生新类使用不能创建抽象类的对象抽象类的指针和...

  • C++ 虚函数

    C++ 虚函数 虚函数 基类中使用virtual关键字声明的函数,称为虚函数。虚函数的实现,通过虚函数表来实现的。...

  • 虚表、虚函数

    什么是虚函数? 使用 virtual 关键字修饰的函数即为虚函数,virtual 关键字只能对类中的非静态函数使用...

  • C++中,构造函数不能设为虚函数,基类析构函数应该设为虚函数

    构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用...

  • 我理解的C++虚函数实现机制

    虚函数使用方法很简单,直接在函数名前面添加关键字virtual声明即可,如果虚函数末尾增加=0则表示为纯虚函数,纯...

  • C++虚函数virtual

    一、构造函数不能是虚函数 首先需要了解 vptr指针和虚函数表的概念,以及这两者的关联。 vptr指针指向虚函数表...

  • 4.2C++虚析构函数

    为什么构造函数不能声明虚函数 在C++中,构造函数用于在创建对象时进行初始化工作,不能声明为虚函数。因为在执行构造...

网友评论

      本文标题:什么时候不能使用虚函数

      本文链接:https://www.haomeiwen.com/subject/oljbottx.html