首页 > 技术文章 > 虚函数与纯虚函数--定义问题

fenglongyu 2017-08-17 16:40 原文

部分转自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!请按任意键继续. . .

 

 

 

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

 

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

 

推荐阅读