继承:继承接口和实现

    在继承体系中有的时候希望只继承一个接口,例如在图形体系中继承draw()函数,因为每个图形都有不同的画法,所以只能继承一个接口,具体怎么画要到派生类中具体实现。所以要定义如下:
class Shape
{
public:
	virtual void draw() = 0;
};

class Rectangle : public Shape
{
public:
void draw(){ cout<<"Rectangle"<< endl;}
};

class Angle : public Shape
{
public:
	void draw(){ cout<<"Angle"<< endl;}
};

这种情况就属于只继承接口的。

    还有就是有的时候要继承接口和实现的,以前对这个知识点不知道。举个栗子吧。比如以上的模型中矩形和三角形的画法是相同的,但是画椭圆的时候画法是不一样的。那么我就希望其中俩个类是继承实现和接口。而椭圆类只继承接口,这样的需求我们该怎么办呢?

    有俩种方法可以做到。第一种就是定义一个默认画法的函数(defaultDraw() ),代码如下:

class Shape
{
public:
	virtual void draw() = 0;
protected:
	void defaultDraw(){ cout << "defaultDraw" << endl; }};
class Rectangle : public Shape
{
public:
	void draw(){ defaultDraw(); }
};


class Angle : public Shape
{
public:
	void draw(){ defaultDraw(); }
};

class Eillpse : public Shape
{
public:
	void draw(){ cout << "Eillpse draw" << endl; }
};

      这样做到了类Rectangle和Angle的画法是一致的,而类Eillpse是不一样的。因为外界不必知道怎么画,所以申明为“protected”。然而可能会觉得这样做不是很好。有一种更加巧妙的方式,不用额外定义函数就可以做到有的类可以只继承接口,有的类继承实现。具体代码如下:

class Shape
{
public:
	virtual void draw() = 0;
protected:
};

void Shape::draw(){ cout << "default draw" << endl; }
class Rectangle : public Shape
{
public:
	void draw(){ Shape::draw(); }
};

class Angle : public Shape
{
public:
	void draw(){ Shape::draw(); }
};

class Eillpse : public Shape
{
public:
	void draw(){ cout << "Eillpse draw" << endl; }
};

    直接定义纯虚函数就可以做到实现与接口的分离操作。多么完美的技巧啊。如果想要继承实现直接调用“Shap::draw()”,如果是继承接口直接重新定义实现就可以了。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值