C++ 虚函数是否需要定义?

来源:互联网 发布:幽默app软件下载 编辑:程序博客网 时间:2024/06/05 20:37

C++ 虚函数是否需要定义?

个人觉得这个问题比较重要。以下是鄙人在阅读了其他博客总结出来的,若有错误,希望得到大家的批评修改!谢谢!

问题: C++中的虚函数必须有定义吗?

答:若该类有实例化对象,则虚函数必须定义,而不是简单的声明。(1)若该类有实例化对象,在类中仅仅声明虚函数而没有定义实现,编译是不可以通过的,将会出现连接错误!2)若该类没有实例化对象,则只声明不定义是可以通过编译的。

例题1:

#include<iostream>using namespace std;class Base{public:int Base_1;int Base_2;public:void func1();virtual void func2();};int main(){    Base obj_base;return 0;}
<p><span style="font-size:14px;">在例题</span><span style="font-family:Calibri;font-size:14px;">1</span><span style="font-size:14px;">中,虚函数</span><span style="font-family:Calibri;font-size:14px;">virtual void func2();</span><span style="font-size:14px;">只有声明,没有定义,但是在主函数中,有类</span><span style="font-family:Calibri;font-size:14px;">Base</span><span style="font-size:14px;">的实例化对象,所以编译通不过,错误如下图所示:</span></p><p><span style="font-size:14px;"><img src="http://img.blog.csdn.net/20150904202243761?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></span></p><span style="font-size:14px;"></span><p><span style="font-size:14px;">修改程序</span><span style="font-family:Calibri;font-size:14px;">1</span><span style="font-size:14px;">,添加</span><span style="font-family:Calibri;font-size:14px;">virtual void func2();</span><span style="font-size:14px;">的定义,则程序编译通过。</span></p><span style="font-size:14px;"></span><p><span style="font-size:14px;">类</span><span style="font-family:Calibri;font-size:14px;">Base</span><span style="font-size:14px;">在内存中的分布如下所示:</span></p>
<span style="font-size:14px;"><img src="http://img.blog.csdn.net/20150904202404596?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></span>
<span style="font-size:14px;"></span><p><span style="font-size:14px;">当然若类没有实例化对象,则类中的虚函数可以不定义只声明,程序如下所示,可以通过编译。</span></p><span style="font-size:14px;"></span><pre class="cpp" name="code">#include<iostream>using namespace std;class Base{public:int Base_1;int Base_2;public:void func1();virtual void func2();};//void Base::func2(){//cout << "pass" << endl;//}int main(){ //   Base obj_base;return 0;}

同时也应该注意virtual关键字的使用,virtual关键字只能出现在类中,不能出现在出了类定义以外的程序中。

例如下面的程序是错误的。

#include<iostream>using namespace std;class Base{public:int Base_1;int Base_2;public:void func1();virtual void func2();};virtual void Base::func2(){cout << "pass" << endl;}int main(){    Base obj_base;return 0;}


0 0
原创粉丝点击