`

虚函数、纯虚函数、虚基类、抽象类、虚函数继承、虚继承

    博客分类:
  • c++
 
阅读更多

虚函数:虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。是C++中多态性的一个重要体现,利用基类指针访问派生类中的成员            函数,这种情况下使用虚函数,这种情况下采用的是动态绑定技术。

          虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,在基类的类定义中定义虚函数的一般形式:

 

          virtual 函数返回值类型 虚函数名(形参表)

 

          { 函数体 }

动态绑定:基类指针是调用派生类的中的成员函数还是调用基类中的成员函数要到程序运行时确定。主要要看指针所指向的对象。

纯虚函数:纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”

              virtual void funtion1()=0

虚基类、抽象类:包含纯虚函数的类称为抽象类。由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象。

虚函数继承:

  虚函数继承就是覆盖。即基类中的虚函数被派生类中的同名函数所覆盖。 是实现多态的方法。

class parent 
  { 
  public: 
  vitual void foo(){cout < <"foo from parent";}; 
  void foo1(){cout < <"foo1 from parent";}; 
  }; 
  class son:public parent 
  {   
  void foo(){cout < <"foo from son";}; 
  void foo1(){cout < <"foo1 from son";}; 
  }; 
  int main() 
  { 
  parent *p=new son(); 
  p->foo(); 
  p->foo1(); 
  return 0; 
  } 

  其输出结果是: 
  foo from son,foo1 from parent

虚继承:

  解决多重继承中派生类成员函数调用模糊问题。比如类A中有一个函数print(),类B继承A,类C继承A,类D继承类B和类C,这个时候,类D中就有两个print函数,一个是   从B继承得到的,一个是从C继承得到的,则,类D的对象调用print函数就会出现print模糊的编译错误。解决办法:类B虚拟继承A。类C虚拟继承A,类D继承B,C时,只拷   贝A中的数据成员和函数成员一次,再遇到拷贝时候就忽略了!

 

  虚继承就是为了节约内存的,他是多重继承中的特有的概念。适用与菱形继承形式。 
  如:类B、C都继承类A,D继承类B和C。为了节省内存空间,可以将B、C对A的继承定义为虚拟继承,此时A就成了虚拟基类。 
  class A; 
  class B:public vitual A; 
  class C:public vitual A; 
  class D:public B,public C; 

 

分享到:
评论

相关推荐

    C++面向对象技术完全剖析_源代码(继承,封装,多态,虚函数,纯虚函数,虚拟继承,多重继承,函数重载,指针……)

    第三个:基类 派生类的关系 以及如何访问抽象类 纯虚函数 还应包含有对象成员(除了一般成员外) ----------------------------------------------------- 带有多对象成员的虚拟多继承 要求:1、虚函数 多态 多态表现...

    C++编写计算三角形、正方形和圆形面积程序

    抽象出一个基类Base,在其中说明一个虚函数,用来求面积,并利用但界面和多定义版本设计求各个图形面积的方法。 了解虚函数对多态性的支持。 掌握虚函数和纯虚函数的概念。 理解静态多态性和动态多态性,学习使用虚...

    实验四类的继承与多态实验.doc

    实验四 类的继承与多态实验1.理解软件重用性的一种形式——继承。 2.能够通过继承已有的类创建新类。 3.理解基类和派生类的概念...8.理解虚函数、纯虚函数和抽象类概念。 9.掌握用抽象类和多态性实现编程的方法。

    C++高级程序设计实验报告实验十 多态性-类型转换与虚函数

    5.理解纯虚类和抽象类。 1.理解下面的程序,并在VS下运行查看结果,回答程序后面的问题。 问题一:上述程序存在两大错误,在不修改主函数和程序原意的前提下,改正该程序中存在的错误。 问题二:①处的转换属于...

    题目:显示宠物信息(Dev C++运行可通过但是会警告)(纯虚函数、父类指针、动态多态性、继承)

    (1)定义抽象宠物类Pet: 数据成员(protected): char name[20]; // 姓名; int age; // 年龄; char color[20]; // 颜色 函数成员(public): 构造函数 Pet (char n[], int a , char c[]);(提示:形参分别...

    面向对象实验3类的多态

    进一步掌握C++中的继承机制,掌握虚函数的声明、定义及用法; 在理解虚函数实现动态绑定机制的基础上,理解虚...了解引入纯虚函数的必要性和抽象类的“接口”作用;从而全面理解面向对象技术中的“多态性”这一大特性。

    leijicheng.rar_继承多态问题

    应用多继承中虚拟基类的应用,掌握虚拟函数在多态性中的应用,掌握虚函数、纯虚函数、抽象类的概念,并能应用抽象类解决实际问题。

    多态性实验

    (1)进一步熟悉类的设计、运用继承与派生机制设计派生类,合理设置数据成员和成员函数。...(4)理解并掌握有纯虚函数的抽象类的作用,在各派生类中重新定义各纯虚函数的方法,以及此时实现的动态多态性

    C++入门指南-v2.4.pdf

    5.3 纯虚函数和抽象类 95 六、C++运算符重载 97 6.1 运算符重载语法介绍 97 6.2 可重载运算符与不可重载运算符 98 6.3 一元运算符重载 99 6.4 二元运算符重载 102 6.5 关系运算符重载 104 6.6 输入/输出运算符重载(&gt;...

    C++测试题库1

    一般将类的析构函数设置为纯虚函数即可将这个类定义为抽象类,抽象类中至少有一个纯虚函数(虚函数是指一个类中你希望重写的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际...

    C++编程知识点1

    声明纯虚函数的类是抽象类,不能实例化只包含纯虚函数的抽象类称为接口,接口不能用虚方法和不能包含已经实现的方法,也不能实例化。基类被虚继承才是虚基类virtual

    C++的概念/解释,可打印,华南师范大学C++考过。

    61. 试说明虚函数和纯虚函数有什么区别 13 62. 基类指针可以指向派生类的对象, 为什么派生类的指针不能指向基类对象? 13 63. 如果一个派生类新增加的数据成员中有一个对象成员,试描述派生类的构造过程 13 64. 为...

    西大成人教育计算机语言(VC)在线作业复习题.docx

    A纯虚函数是一种特殊的虚函数,它没有具体实现 B抽象类是指具有纯虚函数的类 C一个基类中说明有纯虚函数,该基类的派生类一定不是抽象类 D抽象类只能作为基类使用,其纯虚函数的实现由派生类给出 正确答案: A 4 ...

    Visual C++开发经验技巧宝典(第1章)

    0062 如何利用抽象类进行数据封装 25 0063 数据类型与类对象大小的区别 26 0064 实现类的强制转换 26 1.8 高级函数 27 0065 如何重载操作符 27 0066 如何定义重载函数 28 0067 默认构造函数 28 0068 ...

    C++Primer视频(高级)下载地址

    32.15章 纯虚函数与抽象类 33.16章 模板与泛型编程 34.16章 类模板 - 顺序队列 35.16章 类模板 - 链式队列 36.16章 函数模板 37.17章 异常处理(一) 38.17章 异常处理(二) 39.17章 异常处理(三) 40....

    C++编程思想习题

    14.6抽象基类和纯虚函数 14.7继承和VTABLE 14.8虚函数和构造函数 14.8.1构造函数调用次序 14.8.2虚函数在构造函数中的行为 14.9析构函数和虚拟析构函数 14.10小结 14.11练习 第15章 模板和包容器类 15.1包容器和循环...

    C++ Primer第四版【中文高清扫描版】.pdf

    15.6 纯虚函数 502 15.7 容器与继承 503 15.8 句柄类与继承 504 15.8.1 指针型句柄 505 15.8.2 复制未知类型 507 15.8.3 句柄的使用 508 15.9 再谈文本查询示例 511 15.9.1 面向对象的解决方案 513 15.9.2 值型句柄 ...

    C++复习资料之系列

    ( c ) 可以在程序的任何地方 (d) 必须在其它函数中间 2.用C++语言编制的源程序要变为目标程序必须要经过( d )。 (a) 解释 (b) 汇编 (c) 编辑 (d) 编译 3.C++程序基本单位是( c )。 (a) 数据 (b) 字符 (c) ...

    Visual C++ 2005入门经典.part08.rar (整理并添加所有书签)

    9.6.5 抽象类 9.6.6 间接基类 9.6.7 虚析构函数 9.7 类类型之间的强制转换 9.8 嵌套类 9.9 C++/CLI编程 9.9.1 C++/CLI类的继承 9.9.2 接口类 9.9.3 定义接口类 9.9.4 类和程序集 9.9.5 被指定为new的函数 9.9.6 委托...

Global site tag (gtag.js) - Google Analytics