当前位置: 首页 > wzjs >正文

外国人学做中国菜 网站常州住房和城乡建设部网站

外国人学做中国菜 网站,常州住房和城乡建设部网站,某某网站安全建设方案,自动跳转到wap网站目录 抽象类 纯虚函数 只定义了protected构造函数的类 抽象类 抽象类有两种形式: 1 . 声明了纯虚函数的类,称为抽象类 2 . 只定义了protected型构造函数的类,也称为抽象类 纯虚函数 纯虚函数是一种特殊的虚函数,在许多情况…

目录

抽象类

纯虚函数

只定义了protected构造函数的类


抽象类

抽象类有两种形式:

1 . 声明了纯虚函数的类,称为抽象类

2 . 只定义了protected型构造函数的类,也称为抽象类

纯虚函数

纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。纯虚函数的格式如下:

class 类名 {
public:virtual 返回类型 函数名(参数 ...) = 0;
};

在基类中声明纯虚函数就是在告诉派生类的设计者 —— 你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它。

多个派生类可以对纯虚函数进行多种不同的实现,但是都需要遵循基类给出的接口(纯虚函数的声明)。

声明了纯虚函数的类成为抽象类,抽象类不能实例化对象。

看一个简单例子:

class A
{
public:virtual void print() = 0;virtual void display() = 0;
};class B
: public A
{
public:virtual void print() override{cout << "B::print()" << endl;}
};class C
: public B
{
public:virtual void display() override{cout << "C::display()" << endl;}
};void test0(){//A类定义了纯虚函数,A类是抽象类//抽象类无法创建对象//A a;//error//B b;//errorC c;A * pa2 = &c;pa2->print();pa2->display();
}

在A类中声明纯虚函数,A类就是抽象类,无法创建对象;

在B类中去覆盖A类的纯虚函数,如果把所有的纯虚函数都覆盖了(都实现了),B类可以创建对象;只要还有一个纯虚函数没有实现,B类也会是抽象类,也无法创建对象;

再往下派生C类,完成所有的纯虚函数的实现,C类才能够创建对象。

最顶层的基类(声明纯虚函数的类)虽然无法创建对象,但是可以定义此类型的指针,指向派生类对象,去调用实现好的纯虚函数。

—— 这种使用方式也归类为动态多态,尽管不符合第一个条件(基类中声明纯虚函数,而非定义),最终的效果仍然是基类指针调用到了派生类实现的虚函数,属于动态多态的特殊情况。

纯虚函数使用案例:

实现一个图形库,获取图形名称,获取图形之后计算它的面积

#include <iostream>
#include <math.h>
using namespace std;
class Figure
{
public:virtual string getName() const = 0;virtual double getArea() const = 0;};
void display(Figure& fig)
{cout << fig.getName()<< "的面积是:"<< fig.getArea() << endl;
}class Rectangle //矩形
:public Figure
{
public:Rectangle(double len, double wid):_len(len),_wid(wid){}string getName() const override{return "矩形";}double getArea() const override{return _len * _wid;}
private:double _len;double _wid;
};
class Circle 
:public Figure
{
public:Circle(double r):_r(r){}string getName() const override{return "圆形";}double getArea() const override{return  PI * pow(_r, 2);}
private://constexpr 将运行时常量转化为编译时常量//static constexpr double PI = 3.14;static const double PI;double _r;
};
const double Circle::PI = 3.14;class Triangle:public Figure
{
public:Triangle(double a, double b, double c):_a(a),_b(b),_c(c){}string getName() const override{return "三角形";}double getArea() const override{double p = (_a + _b + _c) / 2;return sqrt(p * (p - _a) * (p - _b) * (p - _c));}
private:double _a;double _b;double _c;
};
void test()
{Rectangle r(10, 20);Circle c(2);Triangle t(3, 4, 5);display(r);display(c);display(t);
}
int main()
{test();return 0;}

基类Figure中定义纯虚函数,交给多个派生类去实现,最后可以使用基类的指针(引用)指向(绑定)不同类型的派生类对象,再去调用已经被实现的纯虚函数。

纯虚函数就是为了后续扩展而预留的接口。

只定义了protected构造函数的类

如果一个类只定义了protected型的构造函数而没有提供public构造函数,无论是在外部还是在派生类中作为其对象成员都不能创建该类的对象,但可以由

其派生出新的类,这种能派生新类,却不能创建自己对象的类是另一种形式的抽象类。

Base类只定义了protected属性的构造函数,不能创建Base类的对象,但是可以定义Base类的指针—— Base类是抽象类

如果Derived类也只定义了protected属性的构造函数,Derived类也是抽象类,无法创建对象,但是可以定义指针指向派生类对象

那么还需要再往下派生,一直到某一层提供了public的构造函数,才能创建对象。

class Base {
protected:Base(int base): _base(base) { cout << "Base()" << endl; }int _base;
};
class Derived
: public Base {
public:Derived(int base, int derived): Base(base), _derived(derived){ cout << "Derived(int,int)" << endl; }void print() const{cout << "_base:" << _base<< ", _derived:" << _derived << endl;}
private:int _derived;
};void test()
{Base base(1);//errorDerived derived(1, 2);
}

 

解释如下:

基类的构造函数不能继承,只是可以通过创建基类子对象的形式来进行调用,而不能直接在派生类中直接调用基类的构造函数,所以不可以创建成员子对象。

将构造函数设置为私有,是不能进行继承的。


文章转载自:

http://r6zpRMjq.mkyxp.cn
http://3Ck3zMS4.mkyxp.cn
http://TI4jgvuU.mkyxp.cn
http://dWLcEQse.mkyxp.cn
http://o1UtaB0H.mkyxp.cn
http://zvUP7sVD.mkyxp.cn
http://QL5poT8b.mkyxp.cn
http://hKkRazL6.mkyxp.cn
http://8ENpwsmf.mkyxp.cn
http://wADKuAGb.mkyxp.cn
http://QMykA7Iz.mkyxp.cn
http://3HOFLlN8.mkyxp.cn
http://gbnWtyLz.mkyxp.cn
http://kMd2sQFo.mkyxp.cn
http://ioBonCOF.mkyxp.cn
http://a6NWwnGQ.mkyxp.cn
http://8TI0fqFi.mkyxp.cn
http://WKyUG4g5.mkyxp.cn
http://1p8pYm5t.mkyxp.cn
http://T4gBHMbD.mkyxp.cn
http://e5bWK9Du.mkyxp.cn
http://hFVuy12p.mkyxp.cn
http://vv3vV1DT.mkyxp.cn
http://9iMTEJyn.mkyxp.cn
http://sCpuOcZq.mkyxp.cn
http://XMMv9CWm.mkyxp.cn
http://UsUrTxbg.mkyxp.cn
http://0225oqEq.mkyxp.cn
http://z2rWfO5j.mkyxp.cn
http://rer15QVo.mkyxp.cn
http://www.dtcms.com/wzjs/641826.html

相关文章:

  • 网站设计小图标重庆国外网站推广
  • 嘉鱼网站建设优化高端网站建设过程
  • 做公司网站的模板企业站seo点击软件
  • 做三网站智加设计创新集团
  • flash网站与html5微信名片制作小程序
  • wordpress子站点解析wordpress跳转页面插件
  • 厦门方易网站制作有限公司深圳亿天联网站建设
  • 网站建设 爱诚科技公司包图网免费素材图库官网
  • 上海网站开发月薪多少钱做纺织生意用什么网站好
  • 看案例网站南平武夷山网站建设
  • 枣庄高端网站建设网站制作 代码
  • 营销网站 需求说明建设银行网站注销
  • 字画网站建设wordpress响应式主板
  • 山东卓创网络网站建设做婚庆网站的想法
  • 怎么查看网站是否被百度收录怎么检测网站是否安全
  • 个人网站开发模式企业网站建设中期报告模板
  • 哪个网站可以做顺风车做外卖骑手用哪个网站
  • 本地网站做淘宝客商丘在线商城
  • 安徽淮北做网站的公司鄱阳做网站
  • 静态摄影网站模板五百丁简历模板官方网站
  • 自己用iis怎么建设网站最新网络游戏排行榜2021
  • 下载源码的网站江西省建设培训中心网站
  • 嘉兴网站制作平台个人网站开发 怎么赚钱吗
  • 网站seo查询站长之家建设银行网站打不开怎么办
  • 上海网站关键词优化方法怎么让网站被搜索到
  • 怡清源在慧聪网网站建设情况项目外包网站
  • 企业网站制作 厦门.net 网站 iis 配置
  • 织梦网站模板 虎嗅网上海源码网站建设公司
  • 滨州北京网站建设价格廊坊企业做网站
  • 政务网站建设原则营销型网站建站