C++学习笔记——C++类层次结构要点-创新互联
- 重载解析
- 多继承
- 虚继承
- 类的访问控制public、private、protected
- 类层次结构中漫游(强制类型转换)
- 1. dyanmic_cast
- 2. static_cast
- 3. const_cast
- 4. reinterpret_cast
- 指向成员的指针
- 扩展的类结构信息——typeid
- 虚析构函数和自由存储
- 虚构造函数
重载解析参考自《C++程序设计语言》、《Microsoft C++语言参考》
重载解析的使用不会跨越不同类的作用域。来自不同基类的函数之间的歧义性不能基于参数类型完成解析。如果需要在不同的基类中使用同名函数,需要在使用前使用命名空间声明。(如果参数相同怎么办?)
多继承多重继承提供比单继承更好的灵活性,但是需要在引用部分成员是添加限定。多重继承主要要关注歧义性问题。因为C++查找成员的顺序是如果不能将名称解析为显示引用的类中的成员,编译器就会到该类的基类中找,此时会有三种结果,找到、找不到、有歧义。
虚继承- 可以实现菱形继承结构,即常规继承如果存在多继承,可能将一个类两次作为基类,存在多条继承路径。此时如果要引用基类的成员可能出现歧义性。派生类对象中可能存在多个基类的副本的情况。静态成员除外,类的静态成员只有一个副本。
- 虚继承中,通过虚继承派生的子类承诺共享虚基类的一份副本。此时再通过派生类派生的子类中访问虚基类就不会存在歧义性。
- 另外,如果虚继承的情况中,只有某条路径覆盖了虚基类的成员,直接使用也不会引起歧义性,因为派生类中覆盖的成员有更高的优先级。但是如果在多于一条的虚继承路径中覆盖了虚基类的成员。那么还是会引起歧义性。
- 在对类成员使用关键字时:(在class中,成员默认为private,struct中,成员默认为public)
- 一个成员是private,只能由所在类的成员函数和友元访问和使用。
- 一个成员时protected,只能由所在类及其派生类的成员函数和友元访问和使用。
- 一个成员是public,可以由任何函数访问和使用。
- 在对继承使用关键字时(对基类使用关键字时)【对public成员的访问规则改变较大】
- 基类是private,它的public和protected成员只能由派生类的成员函数和友元访问。只有D的成员和友元能将派生类指针转换到基类指针。
- 基类是protected,它的public和protected成员只能由派生类以及派生类的派生类的成员函数和友元访问。也只有他们能将派生类指针转换到基类指针。
- 基类是public,访问规则与成员访问控制规则一致。任何函数都能将派生类指针转换到基类指针。
要求多态性的操作对象。因为非多态性的操作对象不包含类型信息。
能够保存一定的运行时需要的对象的类型信息,用于在类的继承和组合关系中进行安全的转换。
适用于基类与派生类之间的转换,兄弟类之间的转换,以及能够由这两种场景复合构成的转换。(向上强制、向下强制、交叉强制)。
由于实现的是安全的类型转换,所以通过
if(C2* pc2 = dynamic_cast
,判断指针在类型转换之后的返回值是否为0,来确定是否实现了安全的类型转换。对于引用的转换的合法性,则通过(pc1)) dynamic_cast
本身检查。如果不能实现转换,则会抛出bad_cast
,可以通过try...catch
块设置处理器进行处理。另外由于编译器不能对
void*
所指向的存储提供任何保证,所以dynamic_cast
不能实现从void*
出发的强制转换,因为编译器需要去查看对象,确定类型。此时需要使用static_cast
进行转换。到
void*
的synamic_cast可以用于确定多态类型的对象的起始地址。如果需要跨系统保存一个非多态类型的对象的类型信息,可以将非多态类型的对象包装在一个要穿过的系统的基类中。然后在需要使用的时候,利用dynamic_cast将对象提取出来。例如:
class Io_obj{virtual Io_obj* clone() = 0; }; class Io_date : public Date, public Io_obj{}; void f(Io_obj* pio){Date* pd = dynamic_cast
(pio); }
- 对于
dynamic_cast
实现可用之前,有许多强制转换通过其他机制保证安全。所以dynamic_cast实现的一些操作包含冗余。同时dynamic_cast
具有运行时开销。 - 另外用于实现从
void*
出发的强制转换。
- 用于实现const指针与非const指针之间的转换。
- 但是如果想要实现安全的转换,需要程序员保证该const指针(volatile)本来就不是使用const(或volatile)声明的。
- 与多态指针的差异
- 比
dynamic_cast
保存更多类型信息 - 满足如得到一个类的名字或者它的布局信息。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
当前文章:C++学习笔记——C++类层次结构要点-创新互联
文章来源:http://ybzwz.com/article/iccdp.html