在初步探索了C++继承的语言特性之后,总结下其赋值兼容规则:
1.子类对象可以赋值给父类对象(切割/切片)
在公有继承的前提下,子类是可以赋值给父类对象的,为什么是共有继承(public),因为公有继承会产生“is-a”的关系,这种关系会导致子类中有结构的嵌套这父类的信息,。所以子类可以给父类赋值,期间会发生类似降级的事情,使得赋值成功。若为私有继承,则会产生“has-a”的关系,这种关系是从属关系,基类中的数据仅仅是包含在派生类中,若赋值,则不会产生类似于降级的事情发生,编译器会报错。代码如下:
#includeusing namespace std;class A{public: A() :_num(0) { }private: int _num;};class B:private A{public: B() :A() { }private:};int main(){ B b; A a; a = b;//错误,has-a关系无法赋值 return 0;}#include using namespace std;class A{public: A() :_num(0) { }private: int _num;};class B:public A{public: B() :A() { }private:};int main(){ B b; A a; a = b;//正确,is - a关系可以赋值 return 0;}
2.父类对象不能赋值给子类对象
父类对象给子类对象赋值会造成父类对象的成员变量并不能完全覆盖到子类对象的成员变量,这种做法存在很大的安全问题,编译器是不允许的。
3.父类的指针/引用可以指向子类对象
这种做法是可行的,但产生的父类只能访问到父类所有的内容,子类的内容也会保留下来,若要访问,则只能依靠指针的偏移做到,并不能直接访问,浪费资源。
4.子类的指针/引用不能指向父类对象(可以通过强制类型转换完成)
这样的做法是编译器允许的,但是存在很大的安全问题,若通过强制类型转换,会非常容易发生越界问题,这里我们不提倡。