参考:
C++虚函数理解(一) https://blog.csdn.net/qq_39746351/article/details/77922554
关于C++对象继承中的内存布局示例详解 https://www.jb51.net/article/120341.htm
C++之多态的原理及其分析 https://blog.csdn.net/derkampf/article/details/62046205
多态分为两种:
在 C + + 中 , 编译时 多态性是通过函数重载和运算符重载实现的。
在 C + + 中 , 运行时多态性是通过继承和虚函数来实现的
多态性可以简单概括为“一个接口,多种行为”。每个对象可以用自己的方式去响应共同的消息,即用相同的代码实现不同的动作
#include <iostream>
using namespace std;
// C_Plus_Plus_VS.cpp : 定义控制台应用程序的入口点。
//
#include <iostream>
using namespace std;
class Shape//形状类 (一个接口)
{
public:
double calcArea()
{
cout << "calcArea" << endl;
return 0;
}
};
class Circle :public Shape //公有继承自形状类的圆形类
{
public:
Circle(double r);
double calcArea();
private:
double m_dR;
};
Circle::Circle(double r)
{
m_dR=r;
}
double Circle::calcArea()
{
cout << "circle_calcArea="<<3.14*m_dR*m_dR<<endl;
return 3.14*m_dR*m_dR;
}
class Rect :public Shape //公有继承自形状类的矩形类
{
public:
Rect(double width, double height);
double calcArea();
private:
double m_dWidth;
double m_dHeight;
};
Rect::Rect(double width, double height)
{
m_dWidth=width;
m_dHeight=height;
}
double Rect::calcArea()
{
cout << "rect_calcArea="<<m_dWidth*m_dHeight<< endl;
return m_dWidth*m_dHeight;
}
int main()
{
Shape *circle = new Circle(4.0);
Shape *rect = new Rect(3.0, 5.0);
circle->calcArea();
rect->calcArea();
return 0;
}
结果:
#include <iostream>
using namespace std;
// C_Plus_Plus_VS.cpp : 定义控制台应用程序的入口点。
//
#include <iostream>
using namespace std;
class Shape//形状类 (一个接口)
{
public:
virtual double calcArea()
{
cout << "calcArea" << endl;
return 0;
}
};
class Circle :public Shape //公有继承自形状类的圆形类
{
public:
Circle(double r);
virtual double calcArea();
private:
double m_dR;
};
Circle::Circle(double r)
{
m_dR=r;
}
double Circle::calcArea()
{
cout << "circle_calcArea="<<3.14*m_dR*m_dR<<endl;
return 3.14*m_dR*m_dR;
}
class Rect :public Shape //公有继承自形状类的矩形类
{
public:
Rect(double width, double height);
virtual double calcArea();
private:
double m_dWidth;
double m_dHeight;
};
Rect::Rect(double width, double height)
{
m_dWidth=width;
m_dHeight=height;
}
double Rect::calcArea()
{
cout << "rect_calcArea="<<m_dWidth*m_dHeight<< endl;
return m_dWidth*m_dHeight;
}
int main()
{
Shape *circle = new Circle(4.0);
Shape *rect = new Rect(3.0, 5.0);
circle->calcArea();
rect->calcArea();
return 0;
}
结果: