赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有
成员,而且所有成员的访问控制属性也和基类完全相同。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。赋
值兼容规则中所指的替代包括以下的情况:
1>派生类的对象可以赋值给基类对象。
2>派生类的对象可以初始化基类的引用。
3>派生类对象的地址可以赋给指向基类的指针。
在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。
示例如下:
1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 5 class birds //基类 6 { 7 public: 8 void Speaking() 9 { 10 cout << "......" << endl; 11 } 12 }; 13 14 class owl : public birds //子类 15 { 16 public: 17 void Speaking() 18 { 19 cout << "HOOT! HOOT! " << endl; 20 } 21 }; 22 23 24 int main() 25 { 26 birds b0; 27 owl b1; 28 owl b2; 29 30 b0 = b2; //子类的对象可以赋给基类的对象 31 b0.Speaking(); 32 33 birds &br = b1; //子类的对象可以初始化基类的引用 34 br.Speaking(); 35 36 birds *pt = &b1; //子类的对象的地址可以赋给指向基类的指针 37 pt->Speaking(); 38 39 return 0; 40 }
输出结果:
由运行结果可知,当派生类的对象当成基类的对象使用时,调用的都是基类的成员函数和数据成员;
当birds中的Speaking用virtual修饰时,输出结果会是怎样的呢?
1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 5 class birds //基类 6 { 7 public: 8 virtual void Speaking() 9 { 10 cout << "......" << endl; 11 } 12 }; 13 14 class owl : public birds //子类 15 { 16 public: 17 virtual void Speaking() 18 { 19 cout << "HOOT! HOOT! " << endl; 20 } 21 }; 22 23 24 int main() 25 { 26 birds b0; 27 owl b1; 28 29 b0 = b1; //子类的对象可以赋给基类的对象 30 b0.Speaking(); 31 32 birds &br = b1; //子类的对象可以初始化基类的引用 33 br.Speaking(); 34 35 birds *pt = &b1; //子类的对象的地址可以赋给指向基类的指针 36 pt->Speaking(); 37 38 return 0; 39 }
输出结果:
注意:
复制兼容规则不适用于基类对象,只适用基类引用和指针。