继承

1、基类的protected成员只能被基类的成员和友元及派生类的成员和友元访问。

2、当派生类的成员函数重新定义基类的成员函数时,可以通过在基类成员名前加上基类名和二元作用域解析运算符(::)从派生类访问访问基类成员。

3、void Point::print() const

(1)不会修改对象的数据成员 
(2)const 对象只能重载调用成员函数的const版本,如果一个成员函数没有const版本,那么即使他没有修改类的数据成员也不能被const对象调用

4、将基类的地址赋给派生类指针(没有做显式强制)是一个大大的语法错误。但是如果把派生类的地址赋一个基类的地址还是可以的,执行的是基类的方法。为什么呢?

因为基类包括的内容少,你把一个内容多的书放到一个目录很少的下面,那可怎么查找啊。而如果你把多的目录(派生类的指针)下面放一个小小的书,那自然是绰绰有余了。但也要注意,此时虽然你的大目录可以查找小书(基类)的内容,但是那些多余的目录(派生类新产生的成员函数啊,成员变量啊)就都指到一个空的地方了(小数页数有限),所以即使你有目录,也不可能调用到那些新东西了。所以说:如果一个派生类指针指向一个基类对象,并试图访问一个派生类独有的成员函数,则肯定会发生错误。看到上面蓝色部分了么,说的是如果派生类重新写了一个相同的函数(重载),那这样调用时还是调用的基类的函数====导致产生了虚拟函数()

5、虚拟函数(virtual function)

在基类中声明虚拟函数,派生类可以重写该函数,如:virtual void draw() const;基类定义这个虚拟函数,然后派生类可以对它进行重写,如果不重写那么在派生类中还是虚拟函数。对虚拟函数调用成为动态绑定( 如shapPtr->draw() ),相比静态绑定( 如squareObject.draw() )要灵活的多。所以用虚拟函数进行的动态绑定只发生在通过指针和引用句柄的时候。看调用的那个类的函数就看指针所指向的对象属于那个类,就调用哪个类的函数。假设一个基类Point的指针指向一个派生类Circle对象,程序员使用该指针调用print函数(基类中的虚拟函数,Circle重写了),就会调用Circle对象的print函数。

6、多态性。我的理解就是:多态性就是利用虚拟函数实现的动态绑定。虚拟函数弄上一个纯,咱们就出来一个纯虚拟函数,带有纯虚拟函数的类叫做抽象类。

                 官方的解释:所谓多态性是指通过继承与不同类的对象相关的能力,他们的对象能够对同一个成员函数的调用做出不同的反应。

纯……举例:virtual void draw() const=0;继承他的派生类都重写这个函数,然后创建派生类的对象和基类的指针数组,这样就可以很简单的遥控各个派生类的对象做他们的动作了,有一个例子:vector <shape *> shapeVector(3);创建了基类shape的指针数组shapeVector。然后把它赋上各派生类对象的地址:shapeVector[0] = &point。

vector <Employee *> employees(4);

//这个跟上面的一样,创建了Employee类的对象(抽象类其实不能创建对象,这里只是那么讲而已)的包含四个指针的数组employee。

BasePlusCommissionEmployee *commissionPtr = dynamic_cast < BasePlusCommissionEmployee * >(employees[i]);

//用运算符dynamic_cast帮助确定是否每一个对象的类型与BasePlusCommissionEmployee的类型相符,如果不相符commissionPtr=0,如果相符就是BasePlusCommissionEmployee类对象的地址。自己看着办把

查了下,dynamic_cast是一个强制类型转换,具体的请看下篇博文:总结C++中的所有强制转换符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值