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

php网站开发打不开学网站建设要多久

php网站开发打不开,学网站建设要多久,个人网站设计html,h5响应式网站是什么多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。1、纯虚函数声明如下: virtual void funtion1()0; 纯…

多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。

C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

1、纯虚函数声明如下: virtual void funtion1()=0; 纯虚函数一定没有定义,纯虚函数用来规范派生类的行为,即接口。包含纯虚函数的类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用。

2、虚函数声明如下:virtual ReturnType FunctionName(Parameter) 虚函数必须实现,如果不实现,编译器将报错,错误提示为:

error LNK****: unresolved external symbol "public: virtual void __thiscall ClassName::virtualFunctionName(void)"

3、对于虚函数来说,父类和子类都有各自的版本。由多态方式调用的时候动态绑定。

4、实现了纯虚函数的子类,该纯虚函数在子类中就变成了虚函数,子类的子类即孙子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。

5、虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。

6、在有动态分配堆上内存的时候,析构函数必须是虚函数,但没有必要是纯虚的。

7、友元不是成员函数,只有成员函数才可以是虚拟的,因此友元不能是虚拟函数。但可以通过让友元函数调用虚拟成员函数来解决友元的虚拟问题。

8、析构函数应当是虚函数,将调用相应对象类型的析构函数,因此,如果指针指向的是子类对象,将调用子类的析构函数,然后自动调用基类的析构函数。

C++多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数;

形成多态必须具备三个条件:

1、必须存在继承关系;

2、继承关系必须有同名虚函数(其中虚函数是在基类中使用关键字Virtual声明的函数,在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数);

  1. 存在基类类型的指针或者引用,通过该指针或引用调用虚函数;

动态联编的实现机制 VTABLE

编译器对每个包含虚函数的类创建一个虚函数表VTABLE,表中每一项指向一个虚函数的地址,即VTABLE表可以看成一个函数指针的数组,每个虚函数的入口地址就是这个数组的一个元素。

每个含有虚函数的类都有各自的一张虚函数表VTABLE。每个派生类的VTABLE继承了它各个基类的VTABLE,如果基类VTABLE中包含某一项(虚函数的入口地址),则其派生类的VTABLE中也将包含同样的一项,但是两项的值可能不同。如果派生类中重载了该项对应的虚函数,则派生类VTABLE的该项指向重载后的虚函数,如果派生类中没有对该项对应的虚函数进行重新定义,则使用基类的这个虚函数地址。

在创建含有虚函数的类的对象的时候,编译器会在每个对象的内存布局中增加一个vptr指针项,该指针指向本类的VTABLE。在通过指向基类对象的指针(设为bp)调用一个虚函数时,编译器生成的代码是先获取所指对象的vtb1指针,然后调用vtb1所指向类的VTABLE中的对应项(具体虚函数的入口地址)。

当基类中没有定义虚函数时,其长度=数据成员长度;派生类长度=自身数据成员长度+基类继承的数据成员长度;

当基类中定义虚函数后,其长度=数据成员长度+虚函数表的地址长度;派生类长度=自身数据成员长度+基类继承的数据成员长度+虚函数表的地址长度。

包含一个虚函数和几个虚函数的类的长度增量为0。含有虚函数的类只是增加了一个指针用于存储虚函数表的首地址。

派生类与基类同名的虚函数在VTABLE中有相同的索引号(或序号)。

虚函数这里说的有些乱,因为 C++ 写法奇葩略多。其实可以简单理解。

虚函数可以不实现(定义)。不实现(定义)的虚函数是纯虚函数。

在一个类中如果存在未定义的虚函数,那么不能直接使用该类的实例,可以理解因为未定义 virtual 函数,其类是抽象的,无法实例化。将报错误:

undefined reference to `vtable for xxx'

这和其它语言的抽象类,抽象方法是类似的——我们必须实现抽象类,否则无法实例化。(virtual 和 abstract还是有些区别的)

也就是说,如果存在以下代码:

using namespace std;class Base {
public:virtual void tall();
};class People : Base {
public:void tall() {cout << "people" << endl;};
};

那么,在 main 方法中,我们不能使用 Base base; 这行代码,此时的 tall 没有实现,函数表(vtable)的引用是未定义的,故而无法执行。但我们可以使用 People people; 然后 people.tall();(&people)->tall(); 因为People实现或者说重写、覆盖了 Base 的纯虚方法 tall(),使其在 People 类中有了定义,函数表挂上去了,于是可以诞生实例了。

int main() {
//    Base base;//不可用People people;//可用people.tall();(&people)->tall();return 0;

上述的是针对虚函数而言,普通的函数,即使我们只声明,不定义,也不会产生上述不可用的问题。

父类的虚函数或纯虚函数在子类中依然是虚函数。有时我们并不希望父类的某个函数在子类中被重写,在 C++11 及以后可以用关键字 final 来避免该函数再次被重写。

例:

#include<iostream>
using namespace std;
class Base
{public:virtual void func(){cout<<"This is Base"<<endl;}
};
class _Base:public Base
{public:void func() final//正确,func在Base中是虚函数{cout<<"This is _Base"<<endl;}
};
class __Base:public _Base
{
/*    public://不正确,func在_Base中已经不再是虚函数,不能再被重写void func(){cout<<"This is __Base"<<endl;}*/
};
int main()
{_Base a;__Base b;Base* ptr=&a;ptr->func();ptr=&b;_Base* ptr2=&b;    ptr->func();ptr2->func();
}

以上程序运行结果:

This is _Base
This is _Base
This is _Base

如果不希望一个类被继承,也可以使用 final 关键字。

格式如下:

class Class_name final
{...
};

则该类将不能被继承。

http://www.yayakq.cn/news/737048/

相关文章:

  • 网站建设的最终目标网站session
  • 小程序企业网站开发php wordpress apache
  • 龙华建网站做手机网站和pc如何做
  • wordpress站点设置使用期限it渠道网
  • 金科做的网站logo标志设计网
  • 遵义做网站哪家好网站建设捌金手指下拉三
  • 做违法网站会怎么样百度店铺
  • 百度地图网页版在线使用如何优化网站提高排名
  • 公司网站建设服务费怎么做账浙江省网站建设公司排名
  • 娱乐企业网站建设宁波网站建设电话
  • 宁波网站建设那家好关于建立网站的申请
  • 女人与黑狗做视频网站杭州室内设计公司有哪些
  • 官方网站开发招标须知优秀作文网站推荐
  • 乡下自家院子设计图片江门seo全网营销
  • 我想学制作网站吗做海报的软件
  • 鞍山做网站的公司怎么做自己的博客网站
  • 网站集约化建设工作总结网站SEO优化实训
  • 推荐电商网站建设公共资源交易中心官网官网
  • 网站建设什么公司专业网络推广公司收费标准
  • 网站开发包括哪些技术广州好蜘蛛网站建设
  • 横山桥网站clouder认证考试网站建设
  • 最新消息新闻头条在线优化网站建设
  • 网站站开发 流量网站关键词优化报价
  • 鼎成中考开卷通有关网站做的电子书网站建设是基于
  • 网站悬浮微信二维码电子书网站建设
  • 都有什么公司需要网站建设免费领取永久云服务器
  • 江西个人网站备案移动论坛网站模板
  • 网站做成微信小程序网站所有权
  • 网站公司策划书广州冼村在哪个区
  • 简约大气网站南昌地宝网最新招聘