部分转自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,自己编写了一段代码,编译运行,发现竟然真的可以!
俺的代码:
- class A
- {
- public:
- virtual void pureVirtualFunc() = 0;
- };
- void A::pureVirtualFunc()
- {
- cout<<"I'am pureVirtualFunc"<<endl;
- }
- class B : public A
- {
- public:
- void pureVirtualFunc() { A::pureVirtualFunc(); cout<<"I belong to B!"; }
- };
- int main(void)
- {
- B b;
- b.pureVirtualFunc();
- return 0;
- }
运行结果:
I'am pureVirtualFunc
I belong to B!请按任意键继续. . .
原来抽象类是可以对纯虚函数进行定义的,在其子类中也是可以使用抽象父类的缺省实现!这一切对我来说显得这么突然!好像腿脚一软,站不稳了!是的,以前天天啃个不停个的教材竟然存在如此偏差!等等!好像教材里也没错!里面并没有说“不能”进行函数实现,而是根本就没有提到要去实现。所以老师和天真的我们都默认为不能实现咯!
在此我深深感悟到,目光短浅和学无止境的真正含义了!