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

郑州网站建设乙汉狮网络搜索引擎seo排名优化

郑州网站建设乙汉狮网络,搜索引擎seo排名优化,房产网站开发功能,一品威客网是做什么的注:visual studio复制当前行粘贴到下一行: CTRLD 杂项 调用子类重写的虚函数(带默认参数),但参数用的是基类的虚函数中的默认参数: 这是由于参数是在编译时压入 试题一 交换两个基类指针指向的对象的vf…

注:visual studio复制当前行粘贴到下一行: CTRL+D

杂项

调用子类重写的虚函数(带默认参数),但参数用的是基类的虚函数中的默认参数:

这是由于参数是在编译时压入

试题一

交换两个基类指针指向的对象的vfptr造成的运行结果变化

class Animal
{
public:Animal(string name) :_name(name) {}// 纯虚函数virtual void bark() = 0;
protected:string _name;
};
// 以下是动物实体类
class Cat : public Animal
{
public:Cat(string name) :Animal(name) {}void bark() { cout << _name << " bark: miao miao!" << endl; }
};
class Dog : public Animal
{
public:Dog(string name) :Animal(name) {}void bark() { cout << _name << " bark: wang wang!" << endl; }
};int main()
{Animal* p1 = new Cat("加菲猫");Animal* p2 = new Dog("二哈");int* p11 = (int*)p1;int* p22 = (int*)p2;int temp = p11[0]; // p11[0]访问Cat的前4个字节,即 指向Cat的vftable的vfptrp11[0] = p22[0];  // p22[0]访问Dog的前4个字节,即 指向Dog的vftable的vfptrp22[0] = temp;// 上面代码相当于交换了虚函数表指针// 导致下面调用虚函数时就发生了非预期的情况p1->bark(); // 实际调用Dog::bark()p2->bark(); // 实际调用Cat::bark()delete p1;delete p2;return 0;
}

试题二

有如下代码

#include <iostream>
#include <string>
using namespace std;class Base
{
public:virtual void show(int i = 10){cout << "call Base::show i:" << i << endl;}
};
class Derive : public Base
{
public:void show(int i = 20){cout << "call Derive::show i:" << i << endl;}
};
int main()
{Base* p = new Derive();p->show();delete p;return 0;
}
// 输出结果
// call Derive::show i:10

发现调用的是派生类覆盖的函数,确实是动态绑定,但使用的参数却是基类虚函数的默认参数,而不是派生类重写的虚函数的默认值。

原因是函数调用参数压栈是在编译时期,具体call函数可以在运行时,p->show() 汇编指令大致如下:

push 0Ah # 压入基类的默认实参10
mov eax, dword ptr[p]
mov ecx, dword ptr[eax]
call ecx

试题三

利用多态能调用到派生类private成员函数

#include <iostream>
#include <string>
using namespace std;class Base
{
public:virtual void show(int i = 10){cout << "call Base::show " << endl;}
};
class Derive : public Base
{
private:void show(int i = 20){cout << "call Derive::show" << endl;}
};
int main()
{Base* p = new Derive();// 成员方法限定符是在【编译时】检查,由于编译时通过p检查的是Base::show(),没有问题// 而运行时调用子类覆盖的成员这不影响函数执行p->show(); // 最终调用到Derive::show(),是在运行时期确定delete p;return 0;
}// 输出结果:call Derive::show

如果把基类的虚函数访问权限设置为private,则在编译阶段无法通过

试题四

说明下面代码段一和二是否正确执行,说明理由

#include <iostream>
#include <string>
using namespace std;class Base
{
public:Base(){cout << "call Base()" << endl;clear();}// !!!!!!!!!!!!!!!!!!!!!!!!void clear() { memset(this, 0, sizeof(*this)); }virtual void show(){cout << "call Base::show()" << endl;}
};
class Derive : public Base
{
public:Derive(){cout << "call Derive()" << endl;}void show(){cout << "call Derive::show()" << endl;}
};
int main()
{// 代码段一Base* pb1 = new Base();pb1->show();delete pb1;// 代码段二/*Base* pb2 = new Derive();pb2->show();delete pb2;*/return 0;
}

解答:

代码段一执行失败

因为new Base()调用构造函数时,进入第一行代码前会生成vfptr(就是将vftable地址写入其中),指向Base类对应的虚函数表,但是在构造函数中后面又调用clear函数将内存清0,导致vfptr被置零,随后调用 pb1->show(); 时会使用vfptr则会造成非法访问,运行时提示:

引发了异常: 读取访问权限冲突。

pb1->**** 是 nullptr

代码段二执行成功

执行 new Derive(); 时先调用基类构造,虽然在构造函数中也会使vfptr被清零,但是随后调用派生类构造会将子类的vftable地址赋值给vfptr,所以导致最后通过 pb2->show(); 访问vfptr是没问题的

http://www.tj-hxxt.cn/news/63224.html

相关文章:

  • 网站域名地址沈阳百度seo关键词排名优化软件
  • 道滘镇网站仿做seo研究院
  • 做微博网站好不好互联网论坛
  • 如何优化网站关键词楼市最新消息
  • 毕业论文代做网站可信吗站群优化公司
  • 网络营销课程主要讲什么内容海淀seo搜索引擎优化公司
  • 电商类网站怎么做 seo广告推广有哪些平台
  • 网站怎么做微信送红包活动百度下载安装2021最新版
  • 上海市工程建设标准化信息网站网站关键字优化
  • 广告设计专业课程抖音seo排名系统
  • 做视频素材怎么下载网站中国免费网站服务器下载
  • 枣强网站建设公司360竞价推广怎么做
  • wordpress 3.8.2北京seo实战培训班
  • wordpress职场博客百度seo指数查询
  • 青海网站建设公司哪家好十堰seo优化
  • 哈尔滨无障碍网站建设网络推广推广培训
  • 宁波网站建设服务东莞网站推广排名
  • 江苏专业的网站建设百度竞价关键词价格查询
  • 苏州网站建设制作公司小程序开发网络营销方式有哪几种
  • wordpress主题添加一个自定义页面廊坊seo排名公司
  • 买了域名之后怎么用优化营商环境 提升服务效能
  • 做it的网站推广文案怎么写吸引人
  • 购买qq空间访客的网站线上宣传渠道和宣传方式
  • 电子工程网站大全百度推广是什么工作
  • 网站维护的页面星链seo管理
  • 集团网站建设的要求企业软文营销
  • 护卫神做的网站访问浏览器直接进入网站的注意事项
  • java培训班出来的都怎么样了优化资讯
  • 网站域名的用处网络营销就是
  • 青海公路建设服务网站seo国外推广软件