面向对象程序设计-C++ Inheritance & Multiple inheritance & RTTI【第十三次上课笔记】
Sadly, 这节课带过去的笔记本没电了 T^T
导致没有一行 Code, Sorry
笔记如下:
1 Shape * p1; //使用指针创建对象的方法 2 p = new Circle (2.0); 3 Shape * p2; 4 p = new Rectangle (3.0, 5.0); 5 6 class Shape { 7 public: 8 virtual double area () = 0; //Pure virtual function 9 } 10 11 //Warning: 纯虚函数不能以内敛的形式进行定义,只能在类的外部定义 12 13 //如果,抽象基类中没有定义的虚函数,那么,在其派生类中定义也无法实现 14 15 //C++ 对象布局 16 //概念: 成员函数占的空间不在对象中,而在代码段中 17 18 EmptyClass es; 19 cout << sizeof (es); //输出为1,非空,即只存在es对象的地址 20 21 //1. C++ 给每个含有虚函数的类分配 virtual function table (Vtable) 22 //2. 给其每一个对象创建一个虚指针 23 24 //Override 覆盖: 基类中有虚函数,派生类中重新实现; 返回值类型也要一样 25 //Overload 重载 26 //Namebinding 隐藏: 派生类中定义了函数会把基类中所有同名函数隐藏 27 //恢复隐藏的方法 28 29 int x = d4.Base::f (); //实现间接访问被隐藏的虚函数,所谓的隐藏只是直接访问隐藏 30 31 //在构造函数,析构函数用虚函数,只会调用本类的实现 32 //在非静态成员函数中使用虚函数时,则会调用覆盖了的虚函数版本 33 //因为静态成员函数中无 this 指针 34 35 //RTTI : 运行时类型鉴别, 根据虚函数原理 36 Runtime Type indentification 37 38 #include <typeinfo> //需要导入的头文件 39 40 typeid () //获取当前对象实际类型 41 typeid (br).name () 42 43 //多重继承 44 45 class Dog : public Pet, public animal { 46 47 }; 48 49 //dynamic_case : 向下的类型转化 50 51 Dog * pd = dynamic_case <Dog *> (p); 52 53 //1. 如果 p 的类型是 Dog * 类型,则 pd = p 54 //2. 否则,pd = NULL 为空 55 56 //只用于指针或引用,定义指针类中有虚函数,一定是多态类