精华内容
下载资源
问答
  • 下列输出结果是什么? include using namespace std; class A { public: A() { f(); } virtual void f()

    下列输出结果是什么?

    include<iostream>
    using namespace std;
    
    class A
    {
            public:
                    A()
                    {
                            f();
                    }
                    virtual void  f()
                    {
                            cout<<"a"<<endl;
                    }
    };
    
    class B : public A
    {
            public:
                    B()
                    {
                            f();
                    }
                    void f()
                    {
                            cout<<"b"<<endl;
                    }
    };
    
    int main(int argc,char *argv[])
    {
            A *a = new B();
            B *b = new B();
            B c;
    
            int *aa=new int;
            int *bb=new int();
            int *cc=new int[0];
    }
    

    g++编译后运行结果如下:

    a
    b
    a
    b
    a
    b
    


    展开全文
  • 虚函数

    2014-07-19 10:56:45
    9、下列关于虚函数的说法正确的是() A、在构造函数中调用类自己的虚函数虚函数的动态绑定机制还会生效。 B、在析构函数中调用类自己的虚函数虚函数的动态绑定机制还会生效。 C、静态函数不可以是虚函数 ...
    9、下列关于虚函数的说法正确的是()
    A、在构造函数中调用类自己的虚函数,虚函数的动态绑定机制还会生效。
    B、在析构函数中调用类自己的虚函数,虚函数的动态绑定机制还会生效。
    C、静态函数不可以是虚函数

    因为静态成员函数没有this,也就没有存放vptr的地方,同时其函数的指针存放也不同于一般的成员函数,其无法成为一个对象的虚函数的指针以实现由此带来的动态机制。静态是编译时期就必须确定的,虚函数是运行时期确定的。
    D、虚函数可以声明为inline

    inline函数和virtual函数有着本质的区别,inline函数是在程序被编译时就展开,在函数调用处用整个函数体去替换,而virtual函数是在运行期才能够确定如何去调用的,因而inline函数体现的是一种编译期机制,virtual函数体现的是一种运行期机制。
    因此,内联函数是个静态行为,而虚函数是个动态行为,他们之间是有矛盾的。
    函数的inline属性是在编译时确定的, 然而,virtual的性质则是在运行时确定的,这两个不能同时存在,只能有一个选择,文件中声明inline关键字只是对编译器的建议,编译器是否采纳是编译器的事情。
    我并不否认虚函数也同样可以用inline来修饰,但你必须使用对象来调用,因为对象是没有所谓多态的,多态只面向行为或者方法,但是C++编译器,无法保证一个内联的虚函数只会被对象调用,所以一般来说,编译器将会忽略掉所有的虚函数的内联属性。


    相关知识点:什么函数不能声明为虚函数?
    一个类中将所有的成员函数都尽可能地设置为虚函数总是有益的。 
    设置虚函数须注意: 
    1:只有类的成员函数才能说明为虚函数; 
    2:静态成员函数不能是虚函数; 
    3:内联函数不能为虚函数; 
    4:构造函数不能是虚函数; 
    5:析构函数可以是虚函数,而且通常声明为虚函数。

    展开全文
  • C++哪些函数不能声明为虚函数   什么样的函数不能声明为虚函数?1)不能被继承的函数。2)不能被重写的函数。 1)普通函数 普通函数不属于成员函数,是不能被继承的。普通函数只能被重载,不能被重写,因此声明...

    C++哪些函数不能声明为虚函数

     

    什么样的函数不能声明为虚函数?1)不能被继承的函数。2)不能被重写的函数。

    1)普通函数

    普通函数不属于成员函数,是不能被继承的。普通函数只能被重载,不能被重写,因此声明为虚函数没有意义。因为编译器会在编译时绑定函数。

    而多态体现在运行时绑定。通常通过基类指针指向子类对象实现多态。

    2)友元函数

    友元函数不属于类的成员函数,不能被继承。对于没有继承特性的函数没有虚函数的说法。

    3)构造函数

    首先说下什么是构造函数,构造函数是用来初始化对象的。假如子类可以继承基类构造函数,那么子类对象的构造将使用基类的构造函数,而基类构造函数并不知道子类的有什么成员,显然是不符合语义的。从另外一个角度来讲,多态是通过基类指针指向子类对象来实现多态的,在对象构造之前并没有对象产生,因此无法使用多态特性,这是矛盾的。因此构造函数不允许继承。

    4)内联成员函数

    我们需要知道内联函数就是为了在代码中直接展开,减少函数调用花费的代价。也就是说内联函数是在编译时展开的。而虚函数是为了实现多态,是在运行时绑定的。因此显然内联函数和多态的特性相违背。

    5)静态成员函数

    首先静态成员函数理论是可继承的。但是静态成员函数是编译时确定的,无法动态绑定,不支持多态,因此不能被重写,也就不能被声明为虚函数。

    展开全文
  • 在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该...

    简介

    计算机科学中,内联函数(有时称作在线函数编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省了每次调用函数带来的额外时间开支。但在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的比较复杂的函数进行内联扩展将带来很大的存储资源开支。另外还需要特别注意的是对递归函数的内联扩展可能引起部分编译器的无穷编译。 

    设计内联函数的动机

    内联扩展是一种特别的用于消除调用函数时所造成的固有的时间消耗方法。一般用于能够快速执行的函数,因为在这种情况下函数调用的时间消耗显得更为突出。这种方法对于很小的函数也有空间上的益处,并且它也使得一些其他的优化成为可能。

    没有了内联函式,程式员难以控制哪些函数内联哪些不内联;由编译器自行决定是否内联。加上这种控制维度准许特定于应用的知识,诸如执行函式的频繁程度,被利用于选择哪些函数要内联。

    此外,在一些语言中,内联函数与编译模型联系紧密:如在C++中,有必要在每个使用它的模块中定义一个内联函数;与之相对应的,普通函数必须定义在单个模块中。这使得模块编译独立于其他的模块

    与宏的比较

    通常,在C语言中,内联展开的功能由带参宏(Macros)在源码级实现。内联提供了几个更好的方法:

    • 宏调用并不执行类型检查,甚至连正常参数也不检查,但是函数调用却要检查。

    • C语言的宏使用的是文本替换,可能导致无法预料的后果,因为需要重新计算参数和操作顺序

    • 在宏中的编译错误很难发现,因为它们引用的是扩展的代码,而不是程序员键入的。

    • 许多结构体使用宏或者使用不同的语法来表达很难理解。内联函数使用与普通函数相同的语言,可以随意的内联和不内联。

    • 内联代码的调试信息通常比扩展的宏代码更有用

    内联函数与一般函数的区别
    1)内联含函数比一般函数在前面多一个inline修饰符

    2)内联函数是直接复制“镶嵌”到主函数中去的,就是将内联函数的代码直接放在内联函数的位置上,这与一般函数不同,主函数在调用一般函数的时候,是指令跳转到被调用函数的入口地址,执行完被调用函数后,指令再跳转回主函数上继续执行后面的代码;而由于内联函数是将函数的代码直接放在了函数的位置上,所以没有指令跳转,指令按顺序执行

    3)一般函数的代码段只有一份,放在内存中的某个位置上,当程序调用它是,指令就跳转过来;当下一次程序调用它是,指令又跳转过来;而内联函数是程序中调用几次内联函数,内联函数的代码就会复制几份放在对应的位置上

    4)内联函数一般在头文件中定义,而一般函数在头文件中声明,在cpp中定义

    哪些函数不能声明为内联函数

    1. 包含了递归、循环等结构的函数一般不会被内联。
    2. 虚拟函数一般不会内联,但是如果编译器能在编译时确定具体的调用函数,那么仍然会就地展开该函数。
    3. 如果通过函数指针调用内联函数,那么该函数将不会内联而是通过call进行调用。
    4. 构造和析构函数一般会生成大量代码,因此一般也不适合内联。
    5. 如果内联函数调用了其他函数也不会被内联。

     

    什么时候不能使用内联函数

    1)函数代码量多,功能复杂,体积庞大。对于这种函数,就算加上inline修饰符,系统也不一定会相应,可能还是会当成一般函数处理

    2)递归函数不能使用内联函数

    类与内联函数

    1)类内定义的函数都是内联函数,不管是否有inline修饰符

    2)函数声明在类内,但定义在类外的看是否有inline修饰符,如果有就是内联函数,否则不是。


     

    展开全文
  • 不要在类的构造或者析构函数中调用虚函数,因为这种调用不会如你所愿,即使成功一点,最后还会使你沮丧不已。如果你以前是一个Java或者C#程序员,请密切注意本节的内容-这正是C++与其它语言的大区别之一。  假设你...
  • 但是由于类的构造次序是由基类到派生类,所以在构造函数中调用虚函数,这个虚函数不会呈现出多态 相反,类的析构是从派生类到基类,当调用继承层次中某一层次的类的析构函数时往往意味着其派生类部分已经析构掉,...
  • const虚函数

    千次阅读 2013-04-17 10:14:41
    虚函数的要求是,函数原型相同,函数原型包括:函数返回值、函数名、参数列表、const修饰符。这里const修饰符包括函数返回值的修饰,函数形参的修饰,函数本身的修饰。只要有一处const没有对上 ,那么就不是虚函数...
  • 本篇文章由zg51747708曾广 原创,未经允许不可以转载 ...于是写下这篇博客,来帮助大家更深入的理解虚函数,纯虚函数,虚函数表。希望大家带着批判来阅读,如有错误请私聊我,谢谢! 一.虚函数与纯虚函数定义的解释
  • 初识虚函数 用virtual关键字说明的函数; 虚函数是实现运行时多态性基础; C++中的虚函数是动态绑定的函数; 虚函数必须是非静态的成员函数,虚函数经过派生之后,就可以实现运行过程中的多态; 一般成员函数可以...
  • 一道虚函数的选择题

    千次阅读 2015-03-20 21:20:59
    下列关于虚函数的说法正确的是() A、在构造函数中调用类自己的虚函数虚函数的动态绑定机制还会生效。 B、在析构函数中调用类自己的虚函数虚函数的动态绑定机制还会生效。 C、静态函数不可以是虚函数 D、虚函数...
  • 虚函数的限制

    2015-04-08 21:31:08
     在设置虚函数时必须注意下列事项: 1、只有类的成员函数才能声明为虚函数。这是因为虚函数仅适用于有继承关系的类对象,所以普通函数不能声明为虚函数。 2、静态成员函数不能是虚函数,因为静态成员函数不受限于
  • c++中的虚函数、虚基类、类模板

    千次阅读 2016-08-15 14:17:37
    首先要明白C++什么要引进虚函数这个机制, 虚函数就是在基类中被关键字virtual说明,并在派生类中重新定义的函数。虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类...
  • 抽象类是为了抽象和设计的目的而建立的,处于继承层次结构的上层。 具体类是能够建立对象的类。 抽象类的规定 ...(2)抽象类不能用作参数类型、函数返回类型或显式转换的类型。 (3)可以定义指向抽象类的
  • C++虚函数

    2012-05-11 22:43:49
    通过引用或指针调用虚函数时,编译器将生成代码,在运行时确定调用哪个函数。虚函数需要在函数声明前面加上virtual,在派生类类函数重定义中不需添加virtual关键字。如果一个函数在基类中被声明virtual,那么在...
  • 非成员函数(只能重载)、构造函数(虚函数需要使用对象调用)、静态成员函数(属于类)、内联成员函数、友元函数这五种,下面分别解释什么这五种函数不能被声明成虚函数。 1. 非成员函数  非成员函数只能被...
  • 构造函数不能为虚函数,而析构函数可以为虚函数; 若析构函数
  • 如果你已经从另外一种语言如C#或者Java转向了C++,你会觉得,避免在类的构造函数或者析构函数中调用虚函数这一原则有点违背直觉。但是在C++中,违反这个原则会给你带来难以预料的后果和无尽的烦恼。 正文 ...
  • 不说话,纯膜拜这个分析... 尤其是在分析到用vptr来记录存储虚函数的vtbl的时候,如何去通过地址来访问一个函数。 class Base { private: virtual void f() { cout ; } }; class Deri
  • 如果你已经从另外一种语言如C#或者Java转向了C++,你会觉得,避免在类的构造函数或者析构函数中调用虚函数这一原则有点违背直觉。但是在C++中,违反这个原则会给你带来难以预料的后果和无尽的烦恼。 正文 我想以...
  • 1、啥继承时基类的析构函数声明为虚函数? 文字描述太抽象了,直接用代码给出答案。 (1)第一段代码: #include using namespace std ; class Base { public: Base() { cout 基类的构造函数被调用了" ...
  • 子类必须重载父类里的虚函数 子类必须重载父类里的纯虚函数 虚基类的构造函数在非虚基类之前调用(最终继承类构造函数中,成员初始化列表同时出现对虚基类和非虚基类构造函数的调用时,虚基类的构造函数先于非虚基类...
  • 具体的实现过程是:基类中的函数定义为虚函数,派生类发生覆盖(即函数名称、参数列表、返回值类型完全相同)的情况下,派生类中的函数也会自动变成虚函数,不论加不加virtual关键字。此时,基类与子类对象中都会...
  • 我想以重复本文的主题开篇:不要在类的构造或者析构函数中调用虚函数,因为这种调用不会如你所愿,即使成功一点,最后还会使你沮丧不已。如果你以前是一个Java或者C#程序员,请密切注意本节的内容-这正是C++与其它...
  • C++虚函数与动态联编

    千次阅读 2013-04-30 21:58:56
    虚调用的几种具体情形 虚调用是相对于实调用而言的,它的本质是动态联编...虚调用不能简单理解"对虚函数的调用", 因为对虚函数的调用很可能是实调用。 下面这个程序,对虚函数的调用就是实调用 #include usi
  • 之前看过了陈皓大神关于虚函数表的博客,感觉对多态和虚函数表理解又清楚了一些,但是前不久喷到一道网易的笔试题,主要考察的也是对虚函数的理解,当时在某些地方又纠结了一下,自己写一段代码来验证,加深理解。...
  • 内联虚函数可行吗

    千次阅读 2013-03-01 09:39:50
     当一个函数是内联和虚函数时,会发生代码替换或使用虚表调用吗? 为了弄清楚内联和虚函数,让我们将它们分开来考虑。通常,一个内联函数是被展开的。 class CFoo  {  private:  int val;  public...
  • C++虚函数的4条规则

    2013-03-12 17:34:49
    对于常规的基类函数来说,有下列...4 基类的析构函数应该要么共有虚函数,要么保护虚函数。 说明;1,2两条将虚公有接口的两个职责进行了很好的分解,遵守了单一职责原理。  第4条说明了:如果要使用多态(指针

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,253
精华内容 7,301
关键字:

下列函数为虚函数的是