子类赋值父类的赋值兼容

C++ 中,类型的匹配检测是非常严格的,但是你会发现一个现象,如果一个类继承了另外一个类,把子类的对象赋值给父类的时候,系统不但不提示错误,而且程序还能顺利的编译通过并运行。这其实就是 C++ 内部提供的赋值兼容的过程,但是要注意,如果子类数据成员比父类多,则会出现数据截断。具体表现形式如下图:

2015-05-24_225703

示例代码如下:

#include <iostream>

using namespace std;

class Shape
{
public:
	Shape(int x, int y)
		:_x(x), _y(y){}

	void draw()
	{
		cout << "draw Shap ";
		cout << "start (" << _x << "," << _y << ")" << endl;
	}

protected:
	int _x;
	int _y;
};

// 继承 Shape 类
class Circle : public Shape
{
public:
	Circle(int x, int y, int r)
		:Shape(x, y), _r(r){}

	void draw()
	{
		cout << "draw Circle ";
		cout << "start (" << _x << "," << _y << ") ";
		cout << "radio r = " << _r << endl;
	}

private:
	int _r;
};

int main(int argc, char* argv[])
{
	// 实例化一个父类对象
	Shape s(3, 5);
	s.draw();

	// 实例化一个子类对象
	Circle c(1, 2, 4);
	c.draw();

	cout << "------------------------" << endl;

	// 子类对象给父类变量赋值,普通赋值兼容,会出现数据截断
	s = c;
	s.draw();

	return 0;

}

评论