C++静态多态、动态多态、虚函数

啊~这其实是多态篇的内容 多态呢就是相同对象接受不同消息或不同对象接受相同消息时产生不同的动作

我们下面将两个概念 静态多态 动态多态

静态多态(早绑定)

在我们的类中有两个互为重载的函数的时候,但是参数不一致,在实例化的时候系统能根据我们的参数自动运行相应的函数

#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去掉

这种情况就是数据传入的时候出了问题,系统分辨不出来,使用虚继承呢就可以避免这种情况啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值