继承类的兼容性原则
类的兼容性是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代,通过公有继承,派生类得到了基类中出构造函数、析构函数之外的所有成员。这样,公有派生类实际上就具有了基类的所有功能,凡是基类可以解决的问题,公有派生类都可以解决。继承类有以下五个原则:
1):子类对象可以当做父类对象使用
2):子类对象可以直接赋值给父类对象
3):子类对象可以直接初始化父类对象
4):父类指针可以直接指向子类对象
5):父类引用可以直接引用子类对象
下面通过代码进行实现并对每个原则进行详细的说明
# include <iostream>
using namespace std:
class Animal
{
public:
void sleep()
{cout<<"Animal sleep"<<endl;}
};
class Dog:public Animal
{
void bite(){cout<<"Dog bite"<<endl;}
}:
int main(int argc,char**argv)
{
//1 子类对象可以当做父类对象使用
Dog dog;
dog.sleep();//子类对象可以调用父类方法
//2 子类对象可以直接赋值给父类对象
Animal a;
a=dog;
//3子类对象可以直接初始化父类对象
Animal b=dog;
~~Dog dog1=a;~~ //父类对象不可以直接初始化子类对象
//4父类指针可以直接指向子类对象
Animal *c =new Dog;
~~Dog *dog3=new Animal;~~ //子类指针不可以指向父类对象
//5 父类引用可以直接引用子类对象
Animal &d=dog;
return 0;
}
子类继承父类之后,子类继承了父类的内存空间,子类有自己的成员函数和数据成员,所以在内存空间上大于父类。如下图:
1 那么为什么子类对象为什么可以直接赋值给父类对象呢?
子类对象中包含的信息(成员函数和数据成员)多于父类,因此编译器在编译时可以保证父类所有的信息,反之,父类对象赋值给子类对象的时候,不能保证所有的信息正常的赋给子类对象,此时编译器在编译时就会报错。
2 父类指针为什么可以直接指向子类对象?
父类指针虽然指向子类对象,但是它仍然是父类类型的指针,它能指向的范围仍然是父类的信息(成员函数和数据成员),而子类包含所有的父类信息,所以可以使用父类指针指向子类对象。如果子类指针指向父类对象时,子类指针所指向的范围超出了父类对象的范围,导致内存溢出,编译器此时就会报错。
父类指针指向子类对象,为程序设计提供了方便,可以为程序设计提供一个接口,子类在实现成员方法时,不需要知道架构怎么实现的,只需要提供被调用的方式就可以了,结合多态的使用,就可以实现接口的方法,具体的实现方法可以关注我主页的C++多态的实现及原理,文章中简单地进行了实现,这里就不在过多赘述了。