继承中关于子对象使用方法

子对象

子对象的描述会关于两个类,为了说清楚子对象的关系,换一个话题。

平面上的点与圆

为了说清楚两个类之间的关系,现在编写两个类

  1. 平面直角坐标系中的点类 - CMyPoint
  2. 平面直角坐标系中的圆类 - CMyCircle

当然,这里的核心是点与圆的关系:圆类是包含于点类。

代码部分

先把代码打出来(代码不全,主要是理解)
对于代码一步一步补全:

class CMyPoint
{
	protected:
		double x,y;
	public :
		CMyPoint(double a,double b)
		{
			x=a;
			y=b;
		}
		void showPoint()
		{
		......
		}
		void movePoint(double a,double b)
		{
		......
		}
};

class CMyCircle
{
	protected:
		CMyPoint center;  //这里就是子对象
		double radius;
	public :
		CMyCircle(double a,double b,double c)
		{
			......
		}
		void showPoint()
		{
		......
		}
		void movePoint(double a,double b)
		{
		......
		}

};

其中子对象的概念:
在这里插入图片描述
关注上面这一行代码:可以发现在CMyCircle中创建了CMyPoint对象作为它的数据成员,成为CMyCircle类的对象包含一个CMyPoint类的对象作为其子对象。

构造函数

那么现在就有一个问题:CMyCircle的构造函数怎么写?
不妨来试试:

CMyCircle(double a,double b,double c)
		{
			center.x=a;
			center.y=b;
			radius=c;
		}

但是上机运行后,会发现对前面两个赋值报错

那么我们再试试一个新的:

CMyCircle(double a,double b,double c)center.x(a).center.y(b),radius(c)
		{
		}

这样是构造函数对各个数据成员初始化的标准写法,但是系统还是报错。
这里由于两个类没有继承关系,所以只能访问public成员,但是x和y是protected下,是不允许访问的。

那么正确写法是什么呢?
直接用center去调用构造函数的实际参数。

CMyCircle(double a,double b,double c)center(a,b)
		{
			radius=c;
		}

当然这样也行

CMyCircle(double a,double b,double c)center(a,b),radius(c)
		{
		}

movePoint函数如何设计呢?
先来看看这个判断对不对?

void movePoint(double a,double b)
		{
			center.x +=a;
			center.y +=b;
		}

很明显,有了上面的经验,这个肯定是不对的,center.x 与 center.y都是不可直接访问的
所以我们需要这样做:
利用CMyPoint类中的move函数来完成圆的移动

void movePoint(double a,double b)
		{
			center.movePoint(a,b);
		}

指向对象的指针(c中体现java)

另外外加一个知识点:如何用指针来完成以上的代码呢?

class CMyCircle
{
	protected:
		CMyPoint *pcenter;  //这里就是子对象的指针
		double radius;
	public :
		CMyCircle(double a,double b,double c)
		{
			pcenter = new CMyPoint(a,b);
			delete pcenter;
		}

};

其实指针做法,直接就对应到java语言中来了

class MyPoint
{
	protected double x,y;
	public MyPoint(double a,double b)
	{
		x=a;
		y=b;
	}	
}
class MyCircle
{
	protected MyPoint center;
	protected double radius;

	public MyCircle(double a,double b,double c)
	{
		center = new MyPoint(a,b);
		radius = c;
	}
}

构造函数调用次序

四个字概括:由内及外
析构很好理解:反次序

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值