C++纯虚函数与抽象类

纯虚函数

1.1纯虚函数是在声明虚函数时被“初始化”为0的函数。声明纯虚函数的一般形式为:
virtual 函数类型 函数名 (参数列表) =0;
如 virtual float area() const =0;
1.2纯虚函数没有函数体,而且这是一个声明语句后面应有分号。
1.3纯虚函数最后面的“=0”并不表示返回值为0,它只是起形式上的作用,告诉编译器这是纯虚函数。
1.4纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便派生类型根据需要对它进行定义。
1.5如果在一个类中定义了纯虚函数,而在其派生类中没有对该函数定义,则该虚函数在派生类中仍为纯虚函数。

抽象类

1.1什么是抽象类?
一种不用来定义对象而用来作为一种基本类型而作为继承的类,称为抽象类,由于它常作为基类,故又称为抽象基类。
1.2凡是包含纯虚函数的类都是抽象类。因为纯虚函数是无法调用的,包含纯虚函数的类是无法建立对象的。
1.3往往一些好的面向对象的系统,其顶部是一个抽象类,甚至顶部有好几层抽象类。
1.4如果派生类对基类的所有纯虚函数进行了定义,那么这些函数就被赋予了功能,可以被调用,这个派生类就不是抽象类,而是具体的类。
1.5一段代码:
#include <iostream>
 
using namespace std;
 
class Shape
{
public:
    virtual float area() const{return 0;}
    virtual float volume() const{return 0;}
    virtual void shapeName() const=0;
};
 
class Point:public Shape
{
public:
    Point(float a=0,float b=0);
    void setPoint(float a,float b);
    float getX() const {return x;}
    float getY() const {return y;}
    virtual void shapeName() const {cout << "Points" << endl;}
    friend ostream& operator << (ostream& output,Point& p);
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,Point& p)
{
    output << "[" << p.getX() << "," << p.getY() << "]" << endl;
    return output;
}
 
class Circle:public Point
{
public:
    Circle(float a,float b,float r):Point(a,b),radius(r){}
    void setRadius(float r);
    float getRadius() const {return radius;}
    virtual float area() const ;
    virtual void ShapeName() const {cout << "Circle" << endl;}
    friend ostream& operator << (ostream& output,Circle &c);
protected:
    float radius;
};
 
void Circle::setRadius(float r)
{
    radius=r;
}
 
float Circle::area() const
{
    return 3.14159*radius*radius;
}
 
ostream& operator << (ostream& output,Circle &c)
{
    output << "Center [" << c.x << "," << c.y << "] radius=" << c.radius
           << " area=" << c.area() << endl;
    return output;
}
 
class Cylinder:public Circle
{
public:
    Cylinder(float a,float b,float r,float h):Circle(a,b,r),height(h){}
    void setHeight(float h){height=h;}
    float getHeight() const{return height;}
    virtual float area() const;
    virtual float volume() const;
    virtual void ShapeName() const {cout << "Cylinder" << endl;}
    friend ostream& operator << (ostream& output,Cylinder& cy);
protected:
    float height;
};
 
float Cylinder::area() const
{
    return 2*Circle::area()+2*3.14159*radius*height;
}
 
float Cylinder::volume() const
{
    return Circle::area()*height;
}
 
ostream& operator << (ostream& output,Cylinder& cy)
{
    output << "Center [" << cy.getX() << "," << cy.getY() << "] r="
           << cy.radius << "\narea=" << cy.area() << " volume=" << cy.volume()
           << endl;
    return output;
}
 
 
 
int main()
{
    Point p(1,2);
    Circle cir(1,2,3);
    Cylinder cy(1,2,3,4);
    cout <<"Cylinder\n" << "Center [" << cy.getX() << "," << cy.getY() << "] r="
           << cy.getRadius() << "\narea=" << cy.area() << " volume=" << cy.volume()
           << endl;
    cy.setHeight(1);
    cy.setPoint(2,3);
    cy.setRadius(4);
    cout << "Cylinder\n" << cy << endl;
    Point &px=cy;
    cout << "Point\n" << px;
    Circle &c=cy;
    cout << "Circle\n" << c;
    Shape *pt=&p;
    pt->shapeName();
    cout << "area=" << pt->area() << " volume=" << pt->volume() << endl;
    pt=&cir;
    pt->shapeName();
    cout << "area=" << pt->area() << " volume=" << pt->volume() << endl;
    pt=&cy;
    pt->shapeName();
    cout << "area=" << pt->area() << " volume=" << pt->volume() << endl;
    return 0;
}
 
 1.6一个基类如果包括一个或一个以上的纯虚函数,就是抽象基类。抽象基类不能也不必要定义对象。
1.7抽象基类与普通基类不同,它一般不是现实存在的类的抽象,它可以没有任何物理意义上或其它实际意义方面上的含义。
1.8在类的层次机构中,顶层或最上面的几层可以是抽象基类。
1.9抽象基类是本类族的公共接口。
2.0区别静态关联和动态关联。
2.1如果在基类声明了虚函数,则在派生类中凡是与该函数有相同的函数名,函数类型,参数个数与参数类型的函数,均为虚函数(不论在派生类中是否用virtual声明)。
2.2使用虚函数提高了函数的可扩充性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html 图片防盗链,【反防盗链】介绍一个对付图片防盗链的方法

悲催的声明&#xff1a;由于腾讯也采用了防盗链技术&#xff0c;本文方法已经失效了&#xff01;当我们想在文章里引用某张图片时&#xff0c;如果对方设置了防盗链&#xff0c;我们看到的将是404或forbidden或其他图片&#xff0c;而不是想要的那张图片&#xff0c;为此&#…

C++文件操作与文件流

文件的概念 1.1文件是程序设计中一个重要的概念&#xff0c;所谓“文件”&#xff0c;一般指存储在外部介质上数据的集合。1.2外存文件包括磁盘文件&#xff0c;光盘文件&#xff0c;和U盘文件。1.3对用户来说常用的文件类型有两大类&#xff0c;一类是程序文件&#xff0c;如C…

html字体阴影怎么设置6,css怎么设置字体阴影

css设置字体阴影的方法&#xff1a;使用代码【text-shadow:3px 3px 3px #00f;】&#xff0c;【text-shadow】属性应用于阴影文本&#xff0c;语法为【text-shadow: h-shadow v-shadow blur color;】。本教程操作环境&#xff1a;windows10系统、css3版&#xff0c;该方法适用于…

PCL入门

pcl的入门 本博客主要是对外文的翻译&#xff0c;及其他资料的一些整理。 pcl 分割成好几个模块的库 Filters(滤波器) Features(特征) Keypoints(关键点) Registration(注册) KdTree:k-dimension tree(k维的树) OcTree(八叉树) Segmetation(分割) Sample Consensus(采…

台式电脑怎么看计算机型号,怎么查看台式机的型号

电脑配置有很多&#xff0c;很多人在买电脑总是觉得配置和商家说的不是一样的&#xff0c;下面就让小编教大家台式机怎么查看型号和配置。查看台式机型号和配置的方法金山卫士查看首先打开自己电脑的安全卫士软件&#xff0c;其实卫士都有这种功能的&#xff0c;我这里实用的是…

pcl的初步使用(ROS)

ROS里面已经预装好了pcl&#xff0c;和一些与pcl之间的转换&#xff0c;我们接下来看看如何在ros里面使用pcl.。 总的来说&#xff0c;PCL包含了一个很重要得到数据结构&#xff0c;叫PointCloud&#xff0c;这是一个模板类&#xff0c;把点的类型作为模板参数。 下面是最重要…

四川大学计算机学硕分数线,川大计算机考研分数线

川大计算机考研分数线&#xff1f;2016高考志愿填写&#xff0c;高考考生家长有开端着手预备吗 厚学网收拾了对于普通高校招生填写志愿的有关诀窍&#xff0c;供考生和家长参阅。绝密:高考填报志愿有技巧!志愿填报需要注意的细节问题&#xff1a;语种有限制在咱们要学习的外语语…

pcl里面的3D特征

我这里不介绍pcl里面的类的命名规范&#xff0c;及点的类型。为什么呢?pcl里面类的命名规范&#xff0c;比较繁琐&#xff0c;而且主要是针对要对pcl这个库要开源的人士&#xff0c;而pcl里面的点的类型太多&#xff0c;足够满足你的要求。所以我们要走一条具有中国特色的pcl主…

html本地缓存未查看信息,不同用户看到了相同的信息-一次web系统缓存问题的解决...

最近负责的系统总是出现奇怪的缓存问题&#xff0c;在这里简单记录一下碰到的问题和踩到的坑。问题&#xff1a;用户反映使用不同账号A&#xff0c;B登录时&#xff0c;都出现账号A的页面信息(未邮寄账单提示)。如下所示&#xff1a;图1&#xff1a;未邮寄账单提示一 session缓…

pcl里面的法线估计

法线估计是一个很重要的特征&#xff0c;常常在被使用在很多计算机视觉的应用里面&#xff0c;比如可以用来推出光源的位置&#xff0c;通过阴影与其他视觉影响。 给一个几何表面&#xff0c;去推断给定点的法线方向&#xff0c;即垂直向量的方向往往是不容易的。然而&#xf…

pcl通过积分图来进行法线预测

首先&#xff0c;我们来看一下什么是积分图&#xff0c;我查了一下wiki&#xff0c;发现它的定义是这样的。 A summed area table is a data structure and algorithm for quickly and efficiently generating the sum of values in a rectangular subset of a grid. In the i…

个人计算机的防毒软件无法防御,在win10系统中无法启动defender防御软件的解决方法...

软件大小&#xff1a; 3.56 MB软件版本&#xff1a; 3.3.30.180软件类型&#xff1a;系统补丁查看详情直接下载win10系统是我们现在都在使用的系统&#xff0c;下面小编为大家在win10系统中无法启动defender防御软件的解决方法,希望可以帮助到你们。解决方法&#xff1a;1、根据…

pcl里面的点特征直方图(PFH)

表面法线和曲率可以好的代表一个点的几何特征。然而它们算得很快&#xff0c;而且算法简单&#xff0c;但是它们不能捕获细节&#xff0c;它们只是点的近邻的几何特征的近似估计。作为一个直接的结论&#xff0c;大多数的场景往往会包括很多有着相似特征的点&#xff0c;这会减…

为什么计算机休眠风扇还转,Win7系统进入睡眠模式后电脑风扇还在转的解决方法...

如果长时间离开电脑&#xff0c;可以让win7系统进“睡眠”模式&#xff0c;这样可以节省能源&#xff0c;延长硬盘寿命。但是有位用户说自己Win7系统进入睡眠模式后&#xff0c;依旧可以听到风扇还在转&#xff0c;怎么回事呢&#xff1f;其实这是因为Win7处在低耗能的状态&…

快速特征点直方图描述器(FPFH)

PFH的理论上的时间复杂度是O(nk的平方)&#xff0c;n是点的数量&#xff0c;k是最近邻的个数。对于实时系统来说&#xff0c;这压根就是不行的&#xff0c;所以作为PFH规划的简化版本&#xff0c;FPFH把计算复杂度减少成O(nk),但是还具有很好的和PFH差不多的区分能力。 第一步…

计算机硬盘能达到5g的速度,5G号称可以达到几GB每秒,但是目前的手机处理器和硬盘可以处理这么庞大的数据量吗?...

感谢悟空的邀请&#xff01;“通信行业那些事儿”&#xff0c;专业解读通信、网络类问题&#xff0c;希望我的回答能够给您启发&#xff0c;大家共同探讨、共同提高&#xff01;欢迎关注我&#xff01;楼主您好&#xff01;这个问题&#xff0c;我正好是通信行业的从业人员&…

点集的视点特征直方图的评估

VFH(Viewpoint Feature Histgram)视角特征直方图描述器&#xff0c;可以很直观的表现点的聚类在处理聚类识别与6DOF位姿估计。 下面的图像展示了一个VFH识别和位姿估计的例子。给一些训练集&#xff0c;除了左下角的那个杯子&#xff0c;用来学习&#xff0c;用左下角的杯子作…

计算机电路基础答案,计算机电路基础模拟试卷答案(B)

计算机电路基础》复习题型模拟试卷《计算机电路基础》模拟考试试卷答案(B)一、填空题(1) 场效应管3个电极G、D、S其功能与晶体三极管的 B、C、E 电极相对应&#xff0c;而N沟道和P沟道场效应管则分别类同于 NPN型、PNP型 两种类型的晶体三极管。(2) 触发器分为边沿触发和 脉冲 …

从一个深度图里面导出NARF特征

本节将显示如何提取出NARF关键点通过NARF描述器从一个深度图里面。 以下是一段代码 #include <iostream>#include <boost/thread/thread.hpp> #include <pcl/range_image/range_image.h> #include <pcl/io/pcd_io.h> #include <pcl/visualization/…