标签:span strong 动态绑定 特性 minor virt resize 析构 amp
多态是在父类函数的前面加上 “virtual” 关键字,使子类与父类同名的函数产生一种联系;
多态会用到两个特性:向上造型、动态绑定
向上造型是指:拿一个子类对象当作父类来看待,比如下边代码中的子类Eillpce对象ell当作父类Shape对象来看待;
动态绑定:当我要调用一个函数的时候,运行的时候才知道要调用哪个函数,编译的时候是不确定的;
class Shape { public: Shape(); virtual ~Shape(); //析构为什么会有虚函数 virtual void render(); void move(const XYPos&); virtual void resize(); protected: XYPos center; }; class Ellipse : public Shape { public: Ellipse(float maj, float minr); virtual void render(); //will define own protected: float major_axis,minor_axis; }; class Circle : public Ellipse { public: Circle(float radius) : Ellipse(radius, radius) {} virtual void render(); };
... void render(Shape* p) { p->render(); //这里会根据传进来的形参类型,来决定调用哪个类的render函数 } void func() { Ellipse ell(10, 20); ell.render(); Circle circ(40); circle.render(); render(&ell); // 这里是调用的Ellipse的render函数 render(&circ); //这里是调用了Circle的render函数 }
virtual写在函数前面的作用:如果使用指针或引用调用此函数时,只有在编译的时候才知道选哪个类的render函数去调用,我们这里说void render(Shape *p)中的p指针时多态指针,p的形态是不定可能是基类也可能是某一个子类;
多态的实现:
多态的实现
标签:span strong 动态绑定 特性 minor virt resize 析构 amp
原文地址:https://www.cnblogs.com/go-ahead-wsg/p/12210835.html