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
- C++ 虚函数是否需要定义?
- C++:什么情况下需要将析构函数定义为虚函数?
- C++--何时需要定义赋值/复制构造函数
- C++中析构函数需要定义成虚函数的原因
- C++的析构函数需要定义为虚函数
- 什么时候析构函数需要定义为虚函数
- 什么情况下析构函数需要定义为虚函数?
- 《Effective C++》读书笔记之item46:需要类型转换时请为模板定义非成员函数
- C语言 结构体指针需要申请内存但函数定义指针不需要申请
- linux c 定义打印时间/文件名/行/函数日志的可变参数宏定义,如果需要的话可以参考
- c宏定义函数,
- C语言中malloc函数返回值是否需要类型强制转换问题
- C中需要检验其执行是否成功的函数(检验返回值)
- C语言中malloc函数返回值是否需要类型强制转换问题
- C语言中malloc函数返回值是否需要类型强制转换问题
- 为虚函数,什么情况下需要将析构函数定义为虚函数?
- 定义函数数组[C/C++]
- 嵌入式需要了解的定义函数
- Java入门-泛型
- ubuntu下修改文件夹权限
- shell syntax
- 【codeforces26A】Almost Prime
- usaco Agri-Net
- C++ 虚函数是否需要定义?
- Java基础针对自己薄弱环节总结09(线程中)
- CCF 201403-4无线网络 (二维最短路)
- [华为MU203] 使用AT命令实现网络访问
- Can't open framebuffer device /dev/fb0 ------[TQ2440-QT-first]
- 计算机系统结构的总体概述
- 9-4第二次简单实验
- uva1368 - DNA Consensus String
- linux怎样从vi退出到shell