C++学习(三)

        这几天忙着跑招聘会,把学习的事搁一边啦。心里面没有满足感,于是又开始学习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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值