虚函数
|
纯虚函数
|
基类本身可生成对象
|
基类本身不能生成对象
|
基类中必须提供实现
|
必须在派生类中提供实现
|
"实体继承"
|
"接口继承"
|
纯虚函数
- 带纯虚函数的类叫虚基类(也叫抽象类),这种基类不能直接生成对象,而只有被继承,才能使用。
有一点有意思:
首先想到的:如果纯虚函数有了实现,是不是说明了这个基类可以直接生成对象了?
class A
{
public:
virtual void fun()=0;
};
void A::fun()
{
printf("A::fun/n");
};
int main()
{
A * a = new A;
a->fun();
delete a;
return 0;
}
事实证明不行。g++与cl分别给出错误信息如下:
error: cannot allocate an object of abstract type 'A'
because the following virtual functions are pure within 'A':
virtual void A::fun()
error C2259: 'A' : cannot instantiate abstract class
due to following members:
'void A::fun(void)' : is abstract
see declaration of 'A::fun'
想想也是哈,如果这样的话,和虚函数就没有任何区别了。
然后闪现的是:是不是派生类可以不用为它提供实现了呢?
class B: public A
{
};
int main()
{
A * a = new B;
a->fun();
delete a;
return 0;
}
恩,出现和上面一样的编译错误。那么这个东西是怎么用的呢?
class B: public A
{
public:
void fun()
{
A::fun();
printf("B::fun/n");
}
};
原来需要这样被调用。
为纯虚函数添加定义体应该没什么必要,似乎对纯析构函数,某些时候有用?
ISO C++ 12.4 (7):
A destructor can be declared virtual (10.3) or pure virtual (10.4); if any objects of that class or any derived class are created in the program, the destructor shall be defined. If a class has a base class with a virtual destructor, its destructor (whether user or implicitly declared) is virtual.
ISO C++ 10.4 (2):
A pure virtual function need be defined only if explicitly called with the qualified id syntax (5.1).
虚函数
纯虚函数可以有函数体,那么虚函数是不是可以没有函数体呢?
而且今天在newsmth看到一个网友问:为什么没有函数体不出错?
class A
{
public:
virtual void fun();
};
class B
{
public:
virtual void fun();
};
class C: public A, public B
{
public:
void fun()
{
printf("C::fun/n");
}
};
int main()
{
return 0;
}
我也不知道具体原因,只是感觉上:程序中根本就没使用它,应该不会出错。
甚至还在想,反正C的对象不需要使用A和B中的虚函数,这时创建C的对象应该也没问题吧?
int main(int argc, char* argv[])
{
C c;
c.fun();
return 0;
}
编译器直接告诉结果了:
cckOIw8K.o:virtual.cpp:(.text$_ZN1AC2Ev[A::A()]+0x8): undefined reference to `vtable for A'
cckOIw8K.o:virtual.cpp:(.text$_ZN1BC2Ev[B::B()]+0x8): undefined reference to `vtable for B'
collect2: ld returned 1 exit status
virtual.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall A::fun(void)" (?fun@A@@UAEXXZ)
virtual.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall B::fun(void)" (?fun@B@@UAEXXZ)
virtual.exe : fatal error LNK1120: 2 unresolved externals
好奇怪啊?为何纯虚函数就不需要,虚函数非要有定义呢(我们又不需要使用这个虚函数)。
看来需要学习一点C++对象的内存模型了
参考
相关推荐
C++语言编写面向对象程序,实现柱体体积和表面积的计算...3.从抽象类 Plane 派生出具体类(如长方形类 Rectangle、圆形类 Circle 和三角形类triangle),根据实际情况,覆盖基类 Plane 的纯虚函数 area 和 girth。
Kinect里自带的Body代码,C++的
基于C++的http的post发送接收数据以及xml解析:用winInet来实现http的post请求接收数据,解析xml的数据
— 文件备份:一旦与DrivePro Body监控设备连接,自动备份照片和录像。 — 设备设置:调整DrivePro Body 摄像头的设置,包括麦克风,灯光频率和日期/时间显示格式。 — 固件升级:将DrivePro Body 摄像头升级到...
主要给大家介绍了关于在ASP.NET Core自定义中间件中如何读取Request.Body与Response.Body的内容,文中通过示例代码介绍的非常详细,对大家学习或者使用ASP.NET Core具有一定的参考学习价值,需要的朋友们下面来一起...
@RequestBody与@Validated使用时校验失效.md
浅析@ReponseBody和@RequestBody注解主要讲述了@ReponseBody的作用和@RequestBody的作用和springMvc内部是如何对他们进行解析的
spring 支持@RequestBody注解依赖包 、 spring 支持@RequestBody注解依赖包 spring 支持@RequestBody注解依赖包
CMU在BODY25数据集上训练的模型,包含25个关键点,使用代码与COCO有所不同 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
1.1 Handle-Body与接口、抽象接口 …………………………………………7 1.2 多继承、与菱形缺陷、this跳转等……………………… ……………… 13 1.3 C++多态的两种多态形式和区别……………………………………………...
bullet soft body 代码学习记录,了解bullet引擎的关键点。
body> ,之后字符有效 。 $content = file_get_contents("$filename"); $i = strpos("$content","<body"); $j = $i +1 ; $k = strpos("$content",">",$j); //找到</body>,之前字符有效。 $m ...
• K4W v2 C++ Part 3:读取彩色影像与红外线影像 • K4W v2 C++ Part 4:读取人体位置(Body Index) • K4W v2 C++ Part 5:简单的去背程式 • K4W v2 C++ Part 6:使用OpenGL 绘制场景 • K4W v2 C++ Part 7:...
//(情况2)也可能是根本没有body标签 //对情况1),先跳过空格换行等,看后面的字符是不是body,如果是,此次查询就是对的。 // 如果不是,就重新查询,且定义初始查询位置为上次查询+1,直到有结果。 //对情况2 ...
A Brief History of C++ C++ Organization How to Learn C++ 2. The Basics of Program Writing Programs from Conception to Execution Creating a Real Program Getting Help in Unix Getting Help in an IDE ...
实现了别的服务器通过Http协议接口推送到自己的服务器包体(body)接收代码的实现过程,我这里是用的.net的一般处理程序做的Http接口,调用时候无需定义参数,发布后访问文件全路径就可以获取对方传过来的包体全部...
2D Soft Body 2.0.unitypackage
建模模拟太阳、月亮、地球在一年中的引力和运动,用动画形式展示它们的变化
c++ 发送https POST请求并获取返回数据(包含appKey与appSecret)
【ASP.NET编程知识】ASP.NET Core读取Request.Body的正确方法.docx