#include
using namespace std;
#include
#include
class Shape {
public:
virtual void draw() const=0; //pure virtual 函数;
virtual void error(const std::string& msg){ } //impure virtual 函数;
int objectID() const { //non-pure virtual 函数;
cout << “shape object id” << endl;
return m_objectID;
}
private:
int m_objectID;
};
class Circle : public Shape {
public:
void draw() const {}
int objectID() const {
cout << “Circle object id” << endl;
return m_objectID;
}
private:
int m_objectID;
};
int main()
{
Shape *s = new Circle();
s->objectID(); //shape object id
Circle c; //Circle draw
c.objectID(); //Circle object id
return 0;
}
pure virtual函数draw使它成为一个抽象class,客户不能创建抽象类的对象,所以要求derived class必须实现自己的pure virtual函数。目的就是为了让derived class只能继承函数接口。
impure virtual函数在base class中有默认实现,derived class可以实现自己的函数。
non-virtual函数目的是令derived类继承函数的接口和一份强制实现。
impure virtual和non-virtual的区别在于,当父类指针指向子类对象时,调用的impure virtual函数,如果子类有覆写该函数,会调用子类对象的复写函数,而non-virtual函数则不管子类有没有重新实现该non -virtual函数,父类指针还是调用自己的那份non-virtual函数的实现。具体参考上面的代码输出。
impure virtual函数默认继承带来的问题是,如果扩展的子类确实该有自己的函数实现,但有可能忘记而导致问题。
如下是解决方案,将父类的接口定义成pure virtual,但父类又提供该函数实现,需要父类默认实现的,显示调用父类函数即可,但是防止了子类需要覆写该函数时而忘记复写的问题:
class Airplane {
public:
virtual void fly(const Airport& destination)=0;
};
void Airplane::fly(const Airport& destination){
//缺省实现
}
class ModelA: public Airplane{
public:
virtual void fly(const Airport& destination) {
Airplane::fly(destination);
}
}