本文共 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类中不存在的方法。
利用抽象类实现动态绑定:
四. 派生类的访问权限:
类修饰符 | 基类中的成员与方法 | 派生类中的成员和方法 |
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/