博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++学习(三)
阅读量:4146 次
发布时间:2019-05-25

本文共 2048 字,大约阅读时间需要 6 分钟。

        这几天忙着跑招聘会,把学习的事搁一边啦。心里面没有满足感,于是又开始学习C++啦。毕竟自己选定的路不能就这样放弃啊!对于上次遇到的问题:

为什么VC6.0编译出现以下错误

E:/VC++/exercise/ex6/constructor.cpp(18) : error C2533: 'CDog::CDog' : constructors not allowed a return type

E:/VC++/exercise/ex6/constructor.cpp(52) : error C2264: 'CDog::CDog' : error in function definition or declaration; function not called
执行 cl.exe 时出错.

经过我仔细检查,总有找出了毛病。原来自己在定义完类后没有加分号!这真要人命啊,以后可得注意啦!

今天抽空看了下继承,感觉要理解的概念挺多的,得好好整理一下。

一. 继承的概念:

继承分为单一继承多重继承。

1. 单一继承:从一个父类派生一个子类(一个孩子一个父亲)

2. 多重继承:从多个父类派生一个子类(一个孩子有多个父亲)

    使用多重继承会存在的问题:

1.如果两个父类中存在相同的方法,子类在调用这些相同的方法时会不知所错。

2.如果两个父类的基类相同时,那么子类中将有两个基类对象,如果子类没有覆盖基类中的方法,在调用基类中的方法时,编译器将会出错。

对于以上两种情况都可使用指定类名的方式解决。如:类CBird 和 类CFish中都有move( )方法,子类CWaterBird产生的对象waterbird要调用类CBird中的move( )方法,可使用waterbird.CBird::move( )来实现。

对第2个问题还可以利用虚函数来解决。就是在基类派生子类时在其前加关键字virtual。如class CBird:virtual CAnimal。

 

二. 方法覆盖:

        在继承中,子类还会覆盖父类的成员函数。当父类中有三个重载的方法时,而子类只覆盖了其中一个方法,那么,在子类中访问父类中的其他两个方法是很困难的。也就是说子类隐藏父类重载的成员函数。此时,如果需要访问父类中隐藏的方法,可以先写父类的名称,之后是两个冒号,最后是方法名称。

 

三. 虚函数:

      动物类CAnimal派生一个子类CDog,CDog属于CAnimal。

      如果定义   CAnimal*animal = new CDog;

      通过animal可以访问CAnimal中的方法,但是如何调用CDog类中覆盖的方法呢?这就需要用到虚函数。在声明成员函数时,只要在函数前添加virtual关键字,该成员函数就成为虚函数。在调用一个虚函数是,是以对象运行时的类型确定的,而不是以对象声明时的类型为准。需要注意的是,animal中只能调用CAnimal类中声明的方法,不能调用CDog类中存在而CAnimal类中不存在的方法。

 

利用抽象类实现动态绑定:

  1. #include "iostream.h"
  2. class CShape
  3. {
  4. public:
  5.     CShape();
  6.     ~CShape();
  7.     virtual void DrawShape() = 0;
  8. };
  9. class CRectangle:public CShape
  10. {
  11. public:
  12.     void DrawShape();
  13. };
  14. class CEllipse:public CShape
  15. {
  16. public:
  17.     void DrawShape();
  18. };
  19. CShape::CShape()
  20. {
  21. }
  22. CShape::~CShape()
  23. {
  24. }
  25. void CRectangle::DrawShape()
  26. {
  27.     cout<<"draw rectangle"<<'/n';
  28. }
  29. void CEllipse::DrawShape()
  30. {
  31.     cout<<"draw ellipse"<<'/n';
  32. }
  33. int main()
  34. {
  35.     CShape *shape;
  36.     int i;
  37.     cin>>i;
  38.     switch(i)
  39.     {
  40.     case 0:
  41.         {
  42.             shape = new CRectangle;
  43.             break;
  44.         }
  45.     case 1:
  46.         {
  47.             shape = new CEllipse;
  48.             break;
  49.         }
  50.     }
  51.     shape->DrawShape();
  52.     delete shape;
  53.     return 0;
  54. }

四. 派生类的访问权限:

类修饰符

基类中的成员与方法

派生类中的成员和方法

private        

public,protected,private

public,protected,private

protected

public,protected,private

protected,protected,private

private

public,protected,private

private,private,private

转载地址:http://pynti.baihongyu.com/

你可能感兴趣的文章
Decorator模式
查看>>
Template模式
查看>>
Observer模式
查看>>
高性能服务器设计
查看>>
性能扩展问题要趁早
查看>>
MySQL-数据库、数据表结构操作(SQL)
查看>>
OpenLDAP for Windows 安装手册(2.4.26版)
查看>>
图文介绍openLDAP在windows上的安装配置
查看>>
Pentaho BI开源报表系统
查看>>
Pentaho 开发: 在eclipse中构建Pentaho BI Server工程
查看>>
JSP的内置对象及方法
查看>>
android中SharedPreferences的简单例子
查看>>
android中使用TextView来显示某个网址的内容,使用<ScrollView>来生成下拉列表框
查看>>
andorid里关于wifi的分析
查看>>
Spring MVC和Struts2的比较
查看>>
Hibernate和IBatis对比
查看>>
Spring MVC 教程,快速入门,深入分析
查看>>
Android 的source (需安装 git repo)
查看>>
Commit our mod to our own repo server
查看>>
LOCAL_PRELINK_MODULE和prelink-linux-arm.map
查看>>