动态类型与静态类型:
动态类型 变量或表达式中表示的内存中对象的类型
静态类型 变量声明的类型或表达式中的类型
一般来说引用或指针的类型应与对象的类型一致,但在存在继承关系的对象中是一个重要的例外,(我们可以将基类的指针绑定到派生类对象上)由此可能出现静态类型与动态类型不一致的情况,这便是多态的基础。
#include <bits/stdc++.h>
using namespace std;
class Point
{
double x;
double y;
public:
Point(double x_,double y_)
{
x=x_;
y=y_;
}
virtual double area()=0;//纯虚函数
virtual double volumn()=0;
};
class Circle:public Point
{
double r;
public:
Circle(double x_,double y_,double r_):Point(x_,y_){r=r_;}
virtual double area(){return 3.14*r*r;}
virtual double volumn(){return 0;}
};
class Clinder:public Circle
{
double h;
public:
Clinder(double x_,double y_,double r_,double h_):Circle(x_,y_,r_){h=h_;}//派生类只负责其直接基类的构造函数调用,但在派生类存在虚基类时,所有的虚基类都由最后的派生类负责初始化
virtual double volumn(){return area()*h;}//由于area()为公有,故此处可以直接使用
};
int main()
{
Point *p;
Point *c;
Circle a(1,2,3);
Clinder b(1,2,3,4);
p=&a;
c=&b;//动态联编
cout<<p->area()<<endl;
cout<<c->volumn()<<endl;
cout<<b.volumn()<<endl;//静态联编
}
►纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便 派生类根据需要对它进行定义。如果在一个类中声明了纯虚函数, 而在其派生类中没有对该函数定义,则该虚函数在派生类中仍然为 纯虚函数。
►包含有纯虚函数的类称为抽象类(abstract class)。一个抽象类只 能作为基类来派生新类,所以又称为抽象基类(abstract base class)。抽象类不能定义对象 。
►如果在派生类中给出了抽象类的纯虚函数的实现,则该派生类不再 是抽象类。否则只要派生类仍然有纯虚函数,则派生类依然是抽象 类。抽象类至少含有一个虚函数,而且至少有一个虚函数是纯虚函 数。