1、类型兼容性原则
类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。
类型兼容规则中所指的替代包括以下情况:
1. 子类对象可以当作父类对象使用 2. 3. 子类对象可以直接赋值给父类对象 4. 5. 子类对象可以直接初始化父类对象 6. 7. 父类指针可以直接指向子类对象 8. 9. 父类引用可以直接引用子类对象
在替代之后,派生类对象就可以作为基类的对象使用,但是只能使用从基类继承的成员。
类型兼容规则是多态性的重要基础之一。
2、继承中的内存模型
1. class A 2. { 3. public: 4. protected: 5. int x; 6. int y; 7. private: 8. }; 9. 10. class B:public A 11. { 12. public: 13. protected: 14. int s; 15. private: 16. }; 17. 18. class C:public B 19. { 20. public: 21. protected: 22. int h; 23. int v; 24. private: 25. }; 26. 27. int main() 28. { 29. A objA; 30. B objB; 31. C objC; 32. cout << "sizeof A: " << sizeof(A) << endl; 33. cout << "sizeof B: " << sizeof(B) << endl; 34. cout << "sizeof C: " << sizeof(C) << endl; 35. 36. system("pause"); 37. 38. return 0; 39. }
类B从A类public继承,同时类B自身又增加了一个成员属性s,类C从类B公有继承,同时自身又增加了两个属性h、y。因此继承中的对象模型:
3、继承中的构造析构调用原则
1. 1、子类对象在创建时会首先调用父类的构造函数 2. 2、父类构造函数执行结束后,执行子类的构造函数 3. 3、当父类的构造函数有参数时,需要在子类的初始化列表中显示调用 4. 4、析构函数调用的先后顺序与构造函数相反
1. class Parent 2. { 3. public: 4. Parent(int a, int b ) 5. { 6. this->a = a; 7. this->b = b; 8. cout << "Parent 构造函数" << endl; 9. } 10. 11. ~Parent() 12. { 13. cout << "parent 析构函数" << endl; 14. } 15. private: 16. int a; 17. int b; 18. }; 19. 20. class Child:public Parent 21. { 22. public: 23. Child(int a, int b, int c):Parent(a,b) 24. { 25. this->c = c; 26. cout << "child 构造函数" << endl; 27. } 28. 29. ~Child() 30. { 31. cout << "child 析构函数" << endl; 32. } 33. private: 34. int c; 35. }; 36. 37. void playobj() 38. { 39. Child c1(1, 2, 3); 40. 41. } 42. 43. int main(void) 44. { 45. //Parent p(1, 2); 46. 47. playobj(); 48. system("pause"); 49. }
4、继承中的同名属性和同名方法的处理
1. 1、当子类成员变量与父类成员变量同名时,子类依然从父类继承同名成员 2. 3. 2、在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员,显式地使用类名限定符) 4. 5. 3、同名成员存储在内存中的不同位置
5、继承中的static关键字
1. 1、基类定义的静态成员,将被所有派生类共享 2. 2、根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质 (遵守派生类的访问控制) 3. 3、派生类中访问静态成员,用以下形式显式说明: 4. 类名 :: 成员 5. 6. 或通过对象访问 对象名 . 成员