虚函数和纯虚函数作用的区别,作用

转虚函数和纯虚函数区别 [2]_博客园
当前位置: >
>转虚函数和纯虚函数区别
转虚函数和纯虚函数区别
& 作者:瑞尼书苑 & 来源: 博客园-rooney &
行的时候,程序才可以根据用户的输入判断出指针指向的对象),它只能按照调用Parent类的函数来理解并编译,所以我们看到了 第一行的结果。  那么第二行的结果又是怎么回事呢?我们注意到,Function2()函数在基类中被virtual关键字修饰,也就是 说,它是一个虚函数。虚函数最关键的特点是“动态联编”,它可以在运行时判断指针指向的对象,并自动调用相应的函数。如果我们在运行上面的程序时任意输入 一个非c的字符,结果如下:&This&is&parent,function1&This&is&parent,function2&  请注意看第二行,它的结果出现了变化。程序中仅仅调用了一个Function2()函数,却可以根据用户的输入自动决定到底调用基类中的Function2 还是继承类中的Function2,这就是虚函数的作用。我们知道,在MFC中,很多类都是需要你继承的,它们的成员函数很多都要重载,比如编写MFC应 用程序最常用的CView::OnDraw(CDC*)函数,就必须重载使用。把它定义为虚函数(实际上,在MFC中OnDraw不仅是虚函数,还是纯虚 函数),可以保证时刻调用的是用户自己编写的OnDraw。虚函数的重要用途在这里可见一斑。&-----------------------------------------------------------&再看下面的&派生类的大小问题C++中此文来自: 马开东博客
转载请注明出处 网址:
相关阅读:
template函数模板
来源:(微信/QQ:,微信公众号:makaidong-com) &&&&&& 欢迎分享本文,转载请保留出处!
&&&&&& 【原文阅读】:
上一篇:没有了
【相关文章】
template函数模板
每日最新文章
每日最热文章
本周最热文章
本月最热文章
本年最热文章
Powered by
Copyright &
www.makaidong.com, All Rights Reserved博客访问: 192561
博文数量: 84
博客积分: 1400
博客等级: 上尉
技术积分: 972
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
纯虚函数是用来表示接口的。
如果一个类的成员全部都是纯虚函数,那么这个类就是抽象类,也即接口。这样的类声明不包含任何变量定义和函数定义。头文件可以在多个模块中以最低的依赖关
系共享。如果所有模块都依赖于纯虚类,那么这些模块相互之间可以在运行时替换,无需重新编译整个工程。只要你的纯虚类定义不变。
Windows的COM技术说白了就是基于纯虚函数、多态性进行二进制级的代码共享。学习COM就是要记住那一大堆的纯虚类,以及这些纯虚类代表哪些接口。
abstract class是抽象类,至少包含一个纯虚函数的类就叫做抽象类。
但是如果一个类,所有的成员都是纯虚函数,那么它和一般的抽象类在用法上是有区别的。至少Microsoft给的COM接口定义全部都是仅由纯虚函数构成的类。因此把这样的类定义叫做纯虚类也不算错。
纯虚函数和虚函数的区别在于前者不包含定义,而后者包含函数体。
那么纯虚类就是不包含任何实现(包括成员函数定义和成员变量定义。前者代表算法,后者代表结构)。不包含任何算法和结构的类叫做纯虚类,应该没有问题。
如果一个类的成员全部都是纯虚函数,那么这个类就是纯虚类
说法有误!应该是"如果一个类的成员至少有一个是纯虚函数,那么这个类就是纯虚类"试图实例化一个抽象类对象(即包括一个或多个纯虚函数的类)是一种语法错误。
阅读(2140) | 评论(1) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
如果一个类的成员全部都是纯虚函数,那么这个类就是抽象类
你第一句话就错了,应该是:只要类中有一个纯虚函数(包含或继承),该类就是抽象类!
请登录后评论。C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别 - 旭东的博客 - 博客园
随笔 - 202, 文章 - 0, 评论 - 204, 引用 - 0
1.虚函数(impure virtual)
  C++的虚函数主要作用是&运行时多态&,父类中提供虚函数的实现,为子类提供默认的函数实现。
  子类可以重写父类的虚函数实现子类的特殊化。
  如下就是一个父类中的虚函数:
virtual void out2(string s)
cout&&"A(out2):"&&s&&
2.纯虚函数(pure virtual)
  C++中包含纯虚函数的类,被称为是&抽象类&。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。
  C++中的纯虚函数更像是&只提供申明,没有实现&,是对子类的约束,是&接口继承&。
  C++中的纯虚函数也是一种&运行时多态&。
  如下面的类包含纯虚函数,就是&抽象类&:
virtual void out1(string s)=0;
virtual void out2(string s)
cout&&"A(out2):"&&s&&
3.普通函数(no-virtual)
  普通函数是静态编译的,没有运行时多态,只会根据指针或引用的&字面值&类对象,调用自己的普通函数。
  普通函数是父类为子类提供的&强制实现&。
  因此,在继承关系中,子类不应该重写父类的普通函数,因为函数的调用至于类对象的字面值有关。
4.程序综合实例
#include &iostream&
using namespace
virtual void out1()=0;
///由子类实现
virtual ~A(){};
virtual void out2() ///默认实现
cout&&"A(out2)"&&
void out3() ///强制实现
cout&&"A(out3)"&&
class B:public A
virtual ~B(){};
void out1()
cout&&"B(out1)"&&
void out2()
cout&&"B(out2)"&&
void out3()
cout&&"B(out3)"&&
int main()
A *ab=new B;
ab-&out1();
ab-&out2();
ab-&out3();
cout&&"************************"&&
B *bb=new B;
bb-&out1();
bb-&out2();
bb-&out3();
执行结果:C++虚函数与纯虚函数用法与区别
昨天去面试,被问到虚函数和纯函数时,突然大脑一片混沌,以前不曾认真的考虑过这个问题,总是认为,虚函数只是用来声明的不用定义,纯虚函数不能声明其对象,只要有一个函数时纯虚函数,该类就是纯虚类;这个理解有些偏差,虚函数也会定义,但是在派生类中遇到同名且同参数列表时,这类该类函数会被覆盖。
&& 详细的理解如下所示:
 1.C++虚函数与纯虚函数用法与区别,.虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract
class),而只含有虚函数的类(class)不能被称为抽象类(abstract class)。
  2.虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub
class)中实现该函数才可以使用,因为纯虚函数在基类(base class)只有声明而没有定义。
  3.虚函数和纯虚函数都可以在子类(sub class)中被重载,以多态的形式被调用。
  4.虚函数和纯虚函数通常存在于抽象基类(abstract base class
-ABC)之中,被继承的子类重载,目的是提供一个统一的接口。
  5.虚函数的定义形式:virtual&&&
{method body}
  纯虚函数的定义形式:virtual&&&
  在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time
bind),而且被两者修饰的函数生命周期(life recycle)也不一样。
如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类(ABC)是不能被直接调用的。必须被子类继承重载以后,根据要求调用其子类的方法。
  //father class
  class Virtualbase
  public:
  virtual&&
void& Demon()=
//prue virtual function
  virtual&&
void& Base()
{cout&&"this is farther
  //sub class
  class SubVirtual& :public Virtualbase
  public:
  void Demon() { cout&&" this is
SubVirtual!"&&/P&
  void Base()& {
cout&&"this is subclass
Base"&&/P&
  void main()
  Virtualbase* inst = new SubVirtual(); //multstate pointer
  inst-&Demon();
  inst-&Base();
  //&&&&&
inst = new Virtualbase();
  //&&&&&
inst-&Base()
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。sponsored links
虚函数和纯虚函数的区别
虚函数为了重载和多态的需要,在基类中是已经实现了的,即便是个空实现,所以子类中可以重写也可以不写基类中的此函数!
纯虚函数在基类中是没有实现的,必须在子类中加以实现,很像java中的接口函数!
虚函数是为了继承接口和默认行为
纯虚函数只是继承接口,行为必须重新定义
在很多情况下,基类本身直接生成对象是不合情理的,带纯虚函数的类叫抽象类,这种基类不能直接生成对象。抽象类派生的类的纯虚函数如果没有被改写,那么它的派生类还是个抽象类。
只有成员函数才可以是虚拟的,友元不是成员函数,因此友元不支持虚拟函数。但可以通过让友元函数调用虚拟成员函数来解决友元的虚拟问题。
在有动态分配堆上内存的时候,析构函数若不为虚,对父类的指针调用delete时,释放不了子类中特有的部分,会内存泄露,所以析构函数必须是虚函数,但没有必要是纯虚的,析构函数应当是虚函数,将调用相应对象类型的析构函数,因此,如果指针指向的是子类对象,将调用子类的析构函数,然后自动调用基类的析构函数。
虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数.
class Cman { public: virtual void Eat(){……}; vo ...
http://blog.163.com/hi_qiqiy@126/blog/static//
虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原因:为了方便使用 ...
虚函数和纯虚函数有以下所示方面的区别. (1)类里如果声明了虚函数,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖,这样的话,这样编译器就可以使用后期绑定来达到多态了.纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现. (2)虚函数在子类里面也可以不重载的:但纯虚函数必须在子类去实现,这就像Java的接口一 ...
虚函数为了重载和多态的需要,在基类中是由定义的,即便定义是空,所以子类中可以重写也可以 不写基类中的函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数. class Cman { public: virtual void Eat(){--}; void ...
虚函数与纯虚函数的区别 虚函数为了重载和多态的需要,函数在基类中是有定义的.即便是个空函数,也可以在子类中覆盖这个基类的函数. 纯虚函数在基类中是没有定义的,必须在子类中来实现. 虚函数引入的原因是为了方便使用多态: class Animal{ ..... public: virtual void speak(){cout&&&umum ...
虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数. class Cman { public: virtual void Eat(){--}; void ...}

我要回帖

更多关于 c 纯虚函数的作用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信