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="https://img-blog.youkuaiyun.com/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="https://img-blog.youkuaiyun.com/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;
}