• 虚函数与纯虚函数--定义问题


    部分转自http://blog.csdn.net/qq_20949431/article/details/70740488

    1. 虚函数的声明和定义
    具体关于虚函数的知识不做多讲,我在定义一个抽象类时,忘了将一个虚函数声明为 纯虚函数,又没有对其定义, 导致编译报错时报错如下:
    undefined reference to `vtable for Fibonacci'
    错误提示的很明显,就是无法生成虚函数表。


    我们知道,虚函数表(地址)在定义了虚函数的类所实例化的对象内存中的第一个位置,也就是在实例化过程中生成了虚表。这个错误提示在stackflow中最常见的解答就是类中声明了虚函数,却没有定义。

    总结一下虚函数声明和定义的规则如下:

    类中的virtual函数,要么设为纯虚函数,要么有定义,否则无法生成虚函数表。

    虚函数的可以类外定义,但是必须加上类名,类外定义不需要加virtual
    声明为纯虚函数,则类为抽象类,无法实例化,进一步强调,想要实例化有虚函数的类,必须对虚函数进行定义
    基类定义为虚函数,则子类同名函数也为虚函数,无论是否有virtual关键字修饰(一般声明时加virtual,便于阅读)


    凡是基类定义有虚函数,则基类需要定义虚析构函数(根据上一条法则,虚析构函数要么有定义,要么纯虚,一般不设为纯虚,可以定义空白)
    虚函数通过虚表实现,虚表是类实例化时生成在对象中的(虚表地址),所以如果一个类能够实例化,则其虚函数必须有定义,如果不想定义虚函数,只能声明为纯虚函数,留给子类定义。

    转自 http://blog.csdn.net/happymawolf/article/details/6369585

    2,纯虚函数是可以被定义的。

    今天,我读到《effective c++》的第34条款,里面竟然提到纯虚函数也是可以定义的,大吃一惊,赶快打开vs2005,自己编写了一段代码,编译运行,发现竟然真的可以!

    俺的代码:

    [cpp] view plain copy
     
    1. class A  
    2. {  
    3. public:  
    4.     virtual void pureVirtualFunc() = 0;  
    5. };  
    6.   
    7. void A::pureVirtualFunc()  
    8. {  
    9.     cout<<"I'am pureVirtualFunc"<<endl;  
    10. }  
    11.   
    12. class B : public A  
    13. {  
    14. public:  
    15.     void pureVirtualFunc() { A::pureVirtualFunc(); cout<<"I belong to B!"; }  
    16. };  
    17.   
    18. int main(void)  
    19. {  
    20.     B b;  
    21.     b.pureVirtualFunc();  
    22.   
    23.     return 0;  
    24. }  

     

    运行结果:

    I'am pureVirtualFunc
    I belong to B!请按任意键继续. . .

    原来抽象类是可以对纯虚函数进行定义的,在其子类中也是可以使用抽象父类的缺省实现!这一切对我来说显得这么突然!好像腿脚一软,站不稳了!是的,以前天天啃个不停个的教材竟然存在如此偏差!等等!好像教材里也没错!里面并没有说“不能”进行函数实现,而是根本就没有提到要去实现。所以老师和天真的我们都默认为不能实现咯!

    在此我深深感悟到,目光短浅和学无止境的真正含义了!

  • 相关阅读:
    [hdu6271]Master of Connected Component
    [hdu5468]Puzzled Elena
    [hdu4582]DFS spanning tree
    [poj2054]Color a Tree
    [luogu4107]兔子和樱花
    整除的尾数[HDU2099]
    胜利大逃亡[HDU1253]
    Bitset[HDU2051]
    折线分割平面[HDU2050]
    不容易系列之(4)——考新郎[HDU2049]
  • 原文地址:https://www.cnblogs.com/fenglongyu/p/7382571.html
Copyright © 2020-2023  润新知