C++纯虚函数 virtual =0

news/2024/6/29 12:15:44 标签: c++, class, 编译器, delete, function, c
cle class="tags" href="/tags/CLASS.html" title=class>class="baidu_pl">
cle_content" class="tags" href="/tags/CLASS.html" title=class>class="article_content clearfix">
content_views" class="tags" href="/tags/CLASS.html" title=class>class="htmledit_views"> color:rgb(51,51,51); font-size:14px; line-height:21px">

纯虚函数


class="tags" href="/tags/CLASS.html" title=class>class="first">
class="tags" href="/tags/CLASS.html" title=class>class="text_edit">
一、定义

  纯 虚函数 是一种特殊的虚函数࿰c;它的一般格式如下:
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  class="tags" href="/tags/CLASS.html" title=class>class <类名>
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  {
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  virtual <类型><函数名>(<参数表>)=0;
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  …
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  };
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  在许多情况下࿰c;在基类中不能对虚函数给出有意义有实现࿰c;而把它说明为纯虚函数࿰c;它的实现留给该基类的派生类去做。这就是纯虚函数的作用。
class="tags" href="/tags/CLASS.html" title=class>class="bpctrl">

class="tags" href="/tags/CLASS.html" title=class>class="text_edit">
二、引入原因

  1、为了方便使用 多态 特性࿰c;我们常常需要在基类中定义虚拟函数。
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  2、在很多情况下࿰c;基类本身生成对象是不合情理的。例如࿰c;动物作为一个基类可以派生出老虎、孔雀等子类࿰c;但动物本身生成对象明显不合常理。
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  为了解决上述问题࿰c;引入了纯虚函数的概念࿰c;将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;)࿰c;则class="tags" href="/tags/BianYiQi.html" title=编译器>编译器要求在派生类中必须予以重载以实现多态性。同时含有纯虚拟函数的类称为 抽象类 c;它不能生成对象。这样就很好地解决了上述两个问题。
class="tags" href="/tags/CLASS.html" title=class>class="bpctrl">

class="tags" href="/tags/CLASS.html" title=class>class="text_edit">
三、相似概念

  1、多态性
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性࿰c;运行时多态性。
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  a.编译时多态性:通过重载函数实现
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  b 运行时多态性:通过虚函数实现。
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  2、虚函数
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  虚函数是在基类中被声明为virtual࿰c;并在派生类中重新定义的成员函数࿰c;可实现成员函数的动态重载
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  3、抽象类
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  包含纯虚函数的类称为抽象类。由于抽象类包含了没有定义的纯虚函数࿰c;所以不能定义抽象类的对象。
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  程序举例:
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  基类:
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  class="tags" href="/tags/CLASS.html" title=class>class A
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  {
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  public:
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  A();
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  virtual ~A();
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  void f1();
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  virtual void f2();
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  virtual void f3()=0;
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  };
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  子类:
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  class="tags" href="/tags/CLASS.html" title=class>class B : public A
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  {
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  public:
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  B();
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  virtual ~B();
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  void f1();
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  virtual void f2();
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  virtual void f3();
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  };
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  主函数:
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  int main(int argc, char* argv[])
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  {
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  A *m_j=new B();
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  m_j->f1();
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  m_j->f2();
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  m_j->f3();
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  class="tags" href="/tags/DELETE.html" title=delete>delete m_j;
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  return 0;
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  }
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  f1()是一个隐藏,关于函数的隐藏,可以参考其它词条.
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  调用m_j->f1();会去调用A类中的f1(),它是在我们写好代码的时候就会定好的.
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  也就是根据它是由A类定义的,这样就调用这个类的函数.
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  f2()是普通的重载.
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  调用m_j->f2();会调用m_j中到底保存的对象中,对应的这个函数.这是由于new的B
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  对象.
class="tags" href="/tags/CLASS.html" title=class>class="spctrl">
  f3()与f2()一样,只是在基类中不需要写函数实现.
cle>

http://www.niftyadmin.cn/n/1403608.html

相关文章

LFM法实现的user item推荐系统

所有源码都在github上&#xff08;https://github.com/seasonyao/recommended-system&#xff09; 代码环境&#xff1a;windows环境下python3.5&#xff0c;安装numpy和sklearn即可 源码、数据、结果&#xff1a;https://download.csdn.net/download/codes_first/10741150 …

VS2005/2008中清除最近打开项目的方法

一、手工操作方法&#xff1a; 1)删除最近打开的文件 运行“regedit”&#xff0c;打开 HKEY_CURRENT_USER \Software\Microsoft \VisualStudio \8.0 \FileMRUList 之后&#xff0c;在右边删除相应键值就可以了。&#xff08;该位置清除的是最近打开的文件列表&…

Red Hat Linux 安装 (本地、网络安装)

Red Hat Linux 安装 (本地、网络安装&#xff09;详情件附件本文出自 “李晨光原创技术博客” 博客&#xff0c;转载请与作者联系&#xff01;

pagerank的实现和模拟大量数据情况下的并行分块化

所有源码都在github上&#xff08;https://github.com/seasonyao/pagerank&#xff09; 一、pagerank简介&#xff08;参考书籍《推荐书籍实践》和csdn若干博客 可以跳到第二部分 需要解决的问题&#xff09; 1.PageRank的核心思想 如果一个网页被很多其他网页链接到的话说明…

WINCE PB编译不过各种错误集锦

本文将不择手段搜集WINCEPB的各种编译不过的错误并给出解决方案或是相关思路&#xff0c;搜集资料来源&#xff1a;本人编译出错后得到解决后的学习笔记&#xff0c;网上搜集的资料&#xff0c;朋友的教导等&#xff0c;后面将会详细备注&#xff0c;大家一起交流。文章一式两份…

NLP成长计划(一)

Getting Set Up 需要安装的程序&#xff1a; Anaconda 5.0.1 Python 3.6https://www.anaconda.com/download/ -- Python 3.6 可以更好地处理文本数据 -- Anacond 收集了流行的libraries以及packages. XGboost 安装XGBoost&#xff1a; conda install -c conda-forge xgboost…

关于source中的TARGETLIBS和SOURCELIBS的区别

TARGETLIBS\ $(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib TARGETLIBS指示连接需要的库的名字 SOURCELIBSmm.lib SOURCELIBS指示将于某一个lib一起连接。上面一个lib是需要什么就取什么&#xff0c;而这个lib则是连接所有的。 都是静态链接的.

基于Linux下Iptables限制BT下载的研究

基于Linux下Iptables限制BT下载的研究摘要:当前BT下载技术和软件飞速发展&#xff0c;给人们网上冲浪获取资源带来了极大的便利&#xff0c; 但同时BT占用大量的网络带宽等资源也给网络和网络管理员带来了压力与负担。本文介绍一种利用Linux系统下的应用层 netfilter从协议上限…