C++第五天

第五课  继承与多态
一、下标操作符重载
int a[10] = {...};
a[5] = 100;
*(a+5) = 100;
------------------
Array a (...);
a[5] = 100; // a.operator[] (5) = 100;
cout << a[5] << endl; // cout << a.operator[] (5) << endl;
/
研究返回引用与返回值的区别
retref.cpp
/
1.通常会分别针对下标运算的值作为左值和右值两种情况提供相对应的重载函数。形如:
元素类型& operator[] (size_t i) {...}
const 元素类型& operator[] (size_t i) const {...}
2.下标操作符多数情况下应用在具有连续存储特性的容器类型中。
/
下标操作符重载 array.cpp

二、函数操作符重载(STL模板使用)
返回类型 operator() (形参表) {...}
定义了函数操作符的类型所实例化的对象可以被当做函数使用,其参数表和返回值由上述operator()的参数表和返回值决定。
///
函数操作符重载 func.cpp

三、解引用和间接操作符重载
解引用:*
间接:->
智能指针
///
智能指针smart.cpp
//
四、自定义类型转换和类型转换操作符重载
1.在目标类型中提供一个以源类型为参数的构造函数。
例如:
Integer::Integer (int data) {...}
int -> Integer
通过引入explicit关键字可以强制该类型转换为显式。
2.在源类型中提供一个以目标类型为函数名的类型转换运算符。
例如:
Integer::operator int (void) {...}
Integer -> int
/
int.cpp

五、继承的基本概念和语法
人                   - 基类
  姓名、年龄、吃饭
学生:是人           - 子类
  学号、学习
教师:是人           - 子类
  工资、讲课
     人       
    /  \     派生 |^
学生    教师      V| 继承
继承语法:
class 子类名 : 继承方式1 基类1, 继承方式2 基类2, ... {
};
class Person {...};
class Student : public Person {...};
class Teacher : public Person {...};
单继承与多继承
///
pst.cpp
//
六、公有继承的基本特点
1.一个子类类型的对象在任何时候都可以作为一个基类类型的对象看待。从一个子类类型对象的指针或引用到其基类类型的指针或引用不需要显示类型转换。
2.基类类型的指针或引用不能通过隐式类型转换得到子类类型的指针或引用(编译错误),但是通过显式类型转换可以避免语法上的限制,由此带来的运行时风险要有程序设计者自己评估。
七、继承方式对访控属性的影响
三种继承方式:public、protected、private
当通过一个子类对象访问其从基类中继承的成员时,需要考虑继承方式对访控属性的影响。
访控属性:
访控限定符 访控属性 基类 子类 外部 友元
--------------------------------------
public     公有成员  OK   OK   OK   OK
protected  保护成员  OK   OK   NO   OK
private    私有成员  OK   NO   NO   OK
继承方式:
基类     在公有子 在保护子 在私有子
中的     类中变成 类中变成 类中变成
-----------------------------------
公有成员 公有成员 保护成员 私有成员
保护成员 保护成员 保护成员 私有成员
私有成员 私有成员 私有成员 私有成员
八、子类的构造函数与析构函数
///
consdes.cpp

1.子类没有定义构造函数,系统为子类提供一个无参构造函数,该构造函数会调用基类的无参构造函数构造子类对象中的基类子对象。前提是,基类中要有无参构造函数。
2.若子类的构造函数中没有显式指明其基类部分如果被构造,则系统会调用基类的无参构造函数构造子类对象中的基类子对象。
3.若子类的构造函数在其初始化表中以如下方式:
基类类名 (构造实参表)
指明了其基类的构造方式,则系统会根据重载匹配原则,在基类中选择适当的构造函数构造子类对象中的基类子对象。
4.子类对象的构造顺序:
基类子对象->成员变量->子类的构造代码
5.任何时候子类的析构函数都会自动调用基类的析构函数析构子类对象中的基类子对象。但是基类的析构函数不会自动调用子类的析构函数。因此delete一个指向子类对象的基类指针,可能引发内存泄露!!!
6.子类对象的析构顺序:
子类的析构代码->成员变量->基类子对象
九、子类的拷贝构造函数与拷贝赋值运算符函数
1.缺省方式拷贝构造和拷贝赋值会自动调用基类的拷贝构造和拷贝赋值,以保证子类对象副本中的基类子对象得到正确的复制。
2.自定义的拷贝构造和拷贝赋值需要显式地指明基类部分的拷贝构造和赋值方式,否则子类对象副本中的基类部分或者以无参方式被构造,或者得不到赋值。所谓无参构造函数未必无参,参数可以有默认值。
//
copy.cpp
/
十、名字隐藏
子类中存在与基类中完全相同的标识符即构成隐藏。通过“基类名::”可以指明访问基类中被隐藏的标识符。没有重载这么一回事. 只要是同名标识识就能构成隐藏。 b.A::foo ();隐藏发生在父子类之间,重载发生在同一作用域类的函数中。
十一、私有继承与保护继承
公有继承:IsA子类比父类的范围小
class Student : public Person
Student is a Person
class Cat : public Animal
Cat is a Animal
私有继承:实现继承,工具性的需要。
class DCT {
public:
  void codec (void) {...}
};
class JPEG : protected DCT {
public:
  void render (void) {
    ...
    codec ();
    ...
  }
};
class SJPEG : public JPEG {
public:
  void render (void) {
    ...
    codec ();
    ...
  }
};
Adobe:
十二、多重继承与钻石继承
十三、虚函数与多态
十四、运行时类型信息——RTTI
十五、虚析构函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值