首先让我们看一个例子
#include <iostream>
using namespace std;
class A {
private:
int a;
public :
//A () {}
func () {
cout << "A" << endl;
}
};
class B : public A {
private:
int b;
public :
//B () {}
func () {
cout << "B" << endl;
}
};
int main ()
{
A *a = new B; // 把子类转换成父类是可以的
//B *b = new A; // 但是父类转换成子类是不行滴
return 0;
}
这个例子中A是父类,B是A的子类,在主函数中,可以实例化一个B将其转换成A,即子类可以转换为父类。但是如果反过来,将父类实例化,转化为子类,却无法编译通过。这是为什么呢??
让我们来简单的思考一个小问题,你使用C++的时候,里面可不可以用C的语法,和C的函数。只要使用过C/C++的人肯定都知道,是可以的。那如果反过来呢?
如果你现在使用的是C的编译器,C里可以使用vector容器吗,可以用类吗,这当然是不可以的,面向过程的C不可能兼容面向对象的C++。And C++是C的子类。so我们可以很简单的得到一个结论,就是可以轻松的将子类转化为父类,但是父类大多数却不能转换为子类。
纠其根本原因,子类是继承自父类的,不单单有父类的属性,还有子类自身的属性,所以sizeof (子类)>sizeof (父类),一个存在的东西减少简单,增加就困难了。所以子类可以很简单的通过减少来转换为父类,但是父类很难转换成子类。