啊~这其实是多态篇的内容 多态呢就是相同对象接受不同消息或不同对象接受相同消息时产生不同的动作
我们下面将两个概念 静态多态 动态多态
静态多态(早绑定)
在我们的类中有两个互为重载的函数的时候,但是参数不一致,在实例化的时候系统能根据我们的参数自动运行相应的函数
#include <iostream>
using namespace std;
class Rectangle
{
public:
void calcArea(int _width)
{
m_iWidth=_width;
cout<<m_iWidth<<endl;
}//与下面的函数互为重载
void calcArea(int width,int height)
{
m_iWidth=width;
m_iHeight=height;
cout<<m_iWidth<<endl;
cout<<m_iHeight<<endl;
}
private:
int m_iWidth;
int m_iHeight;
};
int main()
{
Rectangle rect;
rect.calcArea(1);
rect.calcArea(10,20);
system("pause");
return 0;
}
运行结果如下
动态多态(以封装和继承为基础)
#include <iostream>
using namespace std;
class Shape
{
public:
Shape()
{
cout<<"Shape()"<<endl;
}
~Shape()
{
cout<<"~Shape()"<<endl;
}
virtual double calcArea()
{
cout<<"Shape-->calcArea"<<endl;
return 0;
}
};
class Circle: public Shape
{
public:
Circle(double r)
{
cout<<"Circle()"<<endl;
m_dR=r;
}
~Circle()
{
cout<<"~Circle()"<<endl;
}
virtual double calcArea()
{
cout<<"Circle-->calcArea"<<endl;
return 3.14*m_dR*m_dR;
}
private:
double m_dR;
};
class Rect:public Shape
{
public:
Rect(double width,double height)
{
cout<<"Rect()"<<endl;
m_dWidth=width;
m_dHeight=height;
}
~Rect()
{
cout<<"~Rect()"<<endl;
}
double calcArea()
{
cout<<"Rect-->calcArea"<<endl;
return m_dWidth*m_dHeight;
}
private:
double m_dWidth;
double m_dHeight;
};
int main()
{
Shape *shape1=new Circle(5);
Shape *shape2=new Rect(3,6);
cout<<shape1->calcArea()<<endl;
cout<<shape2->calcArea()<<endl;
delete shape1;
delete shape2;
system("pause");
return 0;
}
运行结果如下
这种多态具体到程序中就是用父类指针指向子类对象,并可以通过该指针调用子类
虚继承
C++使用虚拟继承,解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。
我们上面的函数就正常运行了 我们可以把virtual去掉
这种情况就是数据传入的时候出了问题,系统分辨不出来,使用虚继承呢就可以避免这种情况啦