下面是我自己写的一段代码:A类代表Shape,B类代表quadshape,C类代表equalShape:
class Shape
{
public:
//定义两个虚函数
virtual void draw(){cout << "shape draw 1" << endl;}
virtual void vfunc2(){cout << "shape func 2" << endl;}
void func(){cout << "shape" << endl;}
private:
int m_data1, m_data2;
};
class quadShape : public Shape
{
public:
virtual void draw() {cout << "quadShape draw" << endl;};
private:
int m_data3;
};
class equalShape : public quadShape
{
public:
virtual void draw(){cout << "equalShape draw " << endl;}
};
结合代码(脑子里构思图)来说:
举个例子:
//基于上述的三个类
//如果确实虚函数条件,就像我们平时调用的一样,不必多说
//如果没有向上转型,比如
quadShape* dd = new quadShape();
dd->draw();
//输出的必然是quadShape draw,直接调用此类中的即可
//如果不是指针调用
quadShape b;
Shape a = (Shape)b;
a.draw();
//输出的也必然是shape里的draw,因为是静态绑定,什么对象调用,即执行什么类里面的函数
//如果三个条件都满足虚机制(多态):
list<Shape*> mm;
Shape* ss = new quadShape();
Shape* ss1 = new equalShape();
mm.push_back(ss);
mm.push_back(ss1);
ss->draw();
ss1->draw();
cout << mm.size() << endl;
//对于ss指针对象: new的是quadShape类,故而在第一个图的B类里产生一个指针,继而由Shape进行向上转型,
//之后通过B类箭头后面的虚表,调用之后的B::draw()函数,也就是quadShape::draw(),从而输出的是quadShape draw
//后面的equalShape也是一样;从而可以都push_back进list<Shape*>,实现了多态的效果。
this指针就是谁调用,this指针就是代表着谁。以下例子说明this的作用
//把上述Shape类里面的vfunc2()函数改为
void vfunc2(){
cout << "设计模式Template Method" << endl;
draw();
}
//现在在main函数里这样调用
quadShape qs;
qs.vfunc2();
//结果会输出什么呢?
先卖个关子:分析一波。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。