类的说明:

code:

#include<iostream>
#include<string>
#define PAI 3.1415926
using namespace std;
class Shape //抽象类
{
public:
virtual float area() const //计算面积
{
return 0.0;
}
virtual float volume() const//计算体积
{
return 0.0;
}
virtual void ShapeName() const =0;//纯虚函数 ——形状名
};
//声明点类
class Point: public Shape
{
public:
Point(float =0,float =0);
void setPoint(float,float);
float getX()const {return x;}
float getY()const {return y;}
virtual void ShapeName()const
{
cout<<"Point:";
}
friend ostream &operator<< (ostream &,const Point &);
protected:
float x,y;
};
//对点类的函数进行类外定义
Point::Point(float a,float b)
{
x=a;
y=b;
}
void Point::setPoint(float a,float b)
{
x=a;
y=b;
}
ostream &operator<<(ostream &output,const Point&b)
{
output<<"["<<b.x<<","<<b.y<<"]"<<endl;
return output;
}
//声明圈类
class Circle:public Point
{
public:
Circle(float x=0,float y=0,float r=0);
void setRadius(float);
float GetRadius()const;
virtual float area() const;
virtual void ShapeName()const
{
cout<<"Circle:";
}
friend ostream &operator<< (ostream &,const Circle &);
protected:
float radius;
};
//对圈内的函数进行类外定义
Circle::Circle(float x,float y,float r):Point(x,y),radius(r){}
void Circle::setRadius(float r)
{
radius=r;
}
float Circle::GetRadius()const
{
return radius;
}
float Circle::area()const
{
return PAI*radius*radius;
}
ostream &operator<<(ostream &output,const Circle &c)
{
output<<"["<<c.x<<","<<c.y<<"],r="<<c.radius<<endl;
return output;
}
//声明圆柱类
class Cylinder:public Circle
{
public:
Cylinder(float x=0,float y=0,float r=0,float h=0);
void setHeight(float h);
virtual float area()const;
virtual float volume()const;
virtual void ShapeName()const
{
cout<<"Cylinder:";
}
friend ostream &operator<< (ostream &,const Cylinder&);
protected:
float height;
};
//对圆柱类中的函数进行类外定义
Cylinder::Cylinder(float x,float y,float r,float h)
:Circle(x,y,r),height(h){}//对于多层继承,只需要给其直接基类传值
void Cylinder::setHeight(float h)
{
height=h;
}
float Cylinder::area()const
{
return PAI*radius*radius;
}
float Cylinder::volume()const
{
return PAI*radius*radius*height;
}
ostream &operator <<(ostream &output,const Cylinder&c)
{
output<<"["<<c.x<<","<<c.y<<"],r="<<c.radius<<",h="<<c.height<<endl;
return output;
}
int main()
{
Point point(3.2,4.5);
Circle circle(2.4,1.2,5.6);
Cylinder cylinder(3.5,6.4,5.2,10.5);
point.ShapeName(); //静态关联
cout<<point<<endl;
circle.ShapeName(); //静态关联
cout<<circle<<endl;
cylinder.ShapeName(); //静态关联
cout<<cylinder<<endl; Shape *pt; //定义基类指针pt pt=&point; //指针指向point
pt->ShapeName(); //动态关联
cout<<"x="<<point.getX()<<",y="<<point.getY()<<"\narea="<<pt->area()
<<"\nvolume="<<pt->volume()<<endl<<endl; pt=&circle; //指针指向Circle
pt->ShapeName(); //动态关联
cout<<"x="<<circle.getX()<<",y="<<circle.getY()<<"\narea="<<pt->area()
<<"\nvolume="<<pt->volume()<<endl<<endl; pt=&cylinder; //指针指向cylinder
pt->ShapeName(); //动态关联
cout<<"x="<<cylinder.getX()<<",y="<<cylinder.getY()<<"\narea="<<pt->area()
<<"\nvolume="<<pt->volume()<<endl<<endl;
cout<<endl;
return 0;
}

Shape是图形类,它是所有图形的一个概述,抽象了图形的名称,面积,体积函数,并定义为虚函数。因为每一个图形都应该有个名字,所以声明ShapeName函数为纯虚函数,而面积和体积等特性并不一定是每一个图形都具有的特征,所以默认置零。

Point类继承自Shape,它定义了纯虚函数ShapeName,然后添加了自己的setPoint,getX,getY成员函数,并重载了输出流运算符用于Point类的输出。

Circle类继承自Point,它定义了纯虚函数ShapeName,以及虚函数area,然后添加了自己的setRadius,getRadius成员函数,并重载了输出流运算符用于Circle类的输出。

Cylinder类继承自Circle,它定义了纯虚函数ShapeName,以及虚函数area,和volume,然后添加了自己的setHeight成员函数,并重载了输出流运算符用于Cylinder的输出。

区别静态关联和动态关联:

如果是通过对象名调用虚函数(如point.ShapeName()),在编译阶段就能确定调用的是那一个类的虚函数,所以属于静态关联。

如果是通过基类指针调用虚函数(如pt->volume()),在编译阶段无法从语句本身确定是那一个类的虚函数,只有在运行时,pt指向某一类对象后,才能确定调用的是那一个类的虚函数,故为动态关联。

一个C++的多态和虚函数实例的更多相关文章

  1. C++多态、虚函数、纯虚函数、抽象类、虚基类

    一.C++多态 C++的多态包括静态多态和动态多态.静态多态包括函数重载和泛型编程,动态多态包括虚函数.静态多态是指在编译期间就可以确定,动态多态是指在程序运行时才能确定. 二.虚函数 1.虚函数为类 ...

  2. [c++] C++多态(虚函数和虚继承)

    转自:https://www.jianshu.com/p/02183498a2c2 面向对象的三大特性是封装.继承和多态.多态是非常重要的一个特性,C++多态基于虚函数和虚继承实现,本文将完整挖掘C+ ...

  3. C++中的多态与虚函数的内部实现

    1.什么是多态         多态性可以简单概括为“一个接口,多种行为”.         也就是说,向不同的对象发送同一个消息, 不同的对象在接收时会产生不同的行为(即方法).也就是说,每个对象可 ...

  4. C++ 多态与虚函数

    1.多态的概念 由虚函数实现的动态多态性就是:同一类族中不同类的对象,对同一函数调用作出不同的响应. 先看下面这个简单的例子: #include<iostream> using std:: ...

  5. C++多态,虚函数,虚函数表,纯虚函数

    1.多态性   指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作. C++支持两种多态性:编译时多态性,运行时多态性.    a.编译时多态性:通过重载函数实现 ,模板(2次编译)  ...

  6. C++多态、虚函数、纯虚函数、抽象类

    多态 同一函数调用形式(调用形式形同)可以实现不同的操作(执行路径不同),就叫多态. 两种多态: (1)静态多态:分为函数重载和运算符重载,编译时系统就能决定调用哪个函数. (2)动态多态(简称多态) ...

  7. 《挑战30天C++入门极限》C++中类的多态与虚函数的使用

        C++中类的多态与虚函数的使用 类的多态特性是支持面向对象的语言最主要的特性,有过非面向对象语言开发经历的人,通常对这一章节的内容会觉得不习惯,因为很多人错误的认为,支持类的封装的语言就是支持 ...

  8. C++ 多态、虚函数机制以及虚函数表

    1.非virtual函数,调用规则取决于对象的显式类型.例如 A* a  = new B(); a->display(); 调用的就是A类中定义的display().和对象本体是B无关系. 2. ...

  9. C++继承、多态、虚函数

    #答案:http://www.cnblogs.com/tinaluo/articles/6290994.html 1 编写程序:定义一个抽象基类sharpe,只有包含一个求面积的纯虚函数,派生出矩形类 ...

随机推荐

  1. jquery $('#btn').click与$("#btn").live("click",function()有什么区别?

    live方法绑定的事件处理函数,在页面中未来添加的元素只要满足原来的选择器,仍然会导致事件触发.普通的事件绑定则没有这个效果.对于#btn这个选择器来说,如果你未来将id为btn的元素删除,然后再创建 ...

  2. MeasureSpec

    在自定义View和ViewGroup的时候,我们经常会遇到int型的MeasureSpec来表示一个组件的大小,这个变量里面不仅有组件的尺寸大小,还有大小的模式. 这个大小的模式,有点难以理解.在系统 ...

  3. NET平台下的Excel编程|C#操作Excel|Application和ApplicationClass的联系和区别

    NET平台下的Excel编程|C#操作Excel|Application和ApplicationClass的联系和区别 1. Interop含义Interop是互操作的含义.Microsoft.Off ...

  4. MSChart使用之动态生成多个多行ChartArea

    前台代码: <asp:Chart ID=" > <Titles> <asp:Title Name="Title1" runat=" ...

  5. JavaScript--垃圾回收器

    垃圾回收: 释放不再被任何变量引用的对象 垃圾回收器: 专门记录对象的引用次数,并回收不再被引用的对象的程序. 垃圾回收器和主程序并行在后台执行 垃圾回收器会为每个对象创建一个引用计数器(counte ...

  6. web初识-tomcat的基本使用

    Web入门 1.  软件结构: C/S :       有客户端, 维护较麻烦, 需要客户端和服务器端都更新. B/S :       优点 : 客户端就是浏览器, 更新方便, 只需要更新服务器端即可 ...

  7. 3.AOP入门1

    1.定义1.1基本概念2. 1.定义 1.1基本概念 AOP:aspect object programing面向切面编程 aop编程的要点在于关注点和切入点 关注点:指的是代码中的重复部分,每次实现 ...

  8. golang io需要牢记的几个点

    对于Reader比较麻烦需要记住以下: When Read encounters an error or end-of-file condition after successfully readin ...

  9. 再谈CMake与RPATH

    之前写过一篇<探讨CMake中关于RPATH的使用>,只要针对的方面是在编译生成之后(不包括安装的make install)如何去除RPATH的问题.今天给大家主要介绍一下如何让CMake ...

  10. socket (转,吴秦,http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html)

    Linux Socket编程(不限Linux)2010-12-12 21:58 by 吴秦 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web ...