在继承体系中有的时候希望只继承一个接口,例如在图形体系中继承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()”,如果是继承接口直接重新定义实现就可以了。