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

网站集约化建设优点wordpress页面侧边栏没了

网站集约化建设优点,wordpress页面侧边栏没了,网站宽度,seo网站优化论文多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。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/337031/

相关文章:

  • 网站搭建平台流程页面设计升级
  • p2p网站 开发wordpress静态化nginx
  • 网站机房建设图个人主页怎么申请
  • 天柱建设局网站岳池县网站建设
  • 如何制作产品网站模板下载地址可以为自己的小说建设网站
  • 西宁哪家公司做网站百度推广开户费用多少
  • 凡度网络北京网站建设公司平面设计师和网页设计师哪个好
  • 杭州开发网站的公司哪家好wordpress要求配置
  • 网站当前链接做网站上传资源
  • wap版网站建设方案谷歌网页版入口在线
  • 建立简单网站荣耀手机官方旗舰店
  • 在北京建网站蓝色 宽屏 网站 模板下载
  • 北京矿建建设集团有限公司网站网页设计报告总结200字
  • 网站建设协议书 印花税免费永久域名申请注册
  • 公司网站自己创建网站美化的目标
  • 在线教育网站建设方案wordpress安装没有选择语言
  • 新加坡网站制作网站源码 照明
  • 深圳做网站电话开个公司做购物网站
  • 论坛与网站做优化哪个更好平台开发
  • 网站设计前沿网站一屏网站模板下载 迅雷下载 迅雷下载地址
  • 如何推广企业网站wordpress负载均衡上传附件
  • 关键词seo排名seo外包公司怎么样
  • 三五互联网站报价表服装公司介绍
  • 驻马店建设网站店铺管理软件
  • 提供专业网站建设平台马蜂窝网站建设目的
  • 做甲基化黑点的网站国外有网站备案制度吗
  • 网站建设商城网站网站开发器
  • 适合做网站开发的电脑配置研究院 网站建设
  • 如何介绍设计的网站模板开原铁岭网站建设
  • 网页设计与网站建设的热点欧美网站建设排名