#pragma once
/*******************************
*虚函数的实现
*虚函数:允许函数调用与函数体之间联系在运行时才建立,是现实动态联编的基础
*派生后可以在类族中实现运行时多态(动态多态性)
*动态联编,程序运行后在进行联编
********************************/
#include <iostream>
using namespace std;
class Point
{
private:
int X, Y;
public:
Point(int X = 0, int Y = 0)
{
this->X = X, this->Y = Y;
}
virtual double area()//虚函数
{
return 0.0;
}
// double area()//若不是虚函数,可以看一下区别
//{
// return 99;
//}
};
const double PI = 3.14159;
class Circle:public Point
{
public:
Circle(int X, int Y, double R) : Point(X, Y)
{
radius = R;
}
double area()//重定义area函数
{
return PI * radius*radius;
}
private:
double radius;
};
void virtulfuncionmain()
{
Point P1(10, 10);
cout << "P1.area=" << P1.area() << endl;
Circle C1(10, 10, 20);
cout << "C1.area=" << C1.area() << endl;
Point *Pp;//指针对象
Pp = &C1;//按照类型兼容,将派生类对象地址赋给指向基类的指针;
cout << "Pp->area()=" << Pp->area() << endl;//若基类中area不是虚函数,这Pp->area()会调用基类Point的成员函数area(因为Pp类型为Point)
//此时基类中area是虚函数,动态联编,此时Pp->area()会调用指针实际指向对象C1的成员函数area;
//静态联编通常是重载,函数模板;在编译时通过参数类型和参数个数就确定了代码和操作的关系;(静态多态性)
Point &Rp = C1; //引用对象时同上
cout << "Rp.area=" << Rp.area() << endl;
}
int main()
{
virtulfuncionmain();//学习虚函数,实现动态联编
}