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

钟表商城网站建设方案澧县网站建设

钟表商城网站建设方案,澧县网站建设,做如美团式网站要多少钱,做网站配置服务器注#xff1a;visual studio复制当前行粘贴到下一行#xff1a; CTRLD 杂项 调用子类重写的虚函数#xff08;带默认参数#xff09;#xff0c;但参数用的是基类的虚函数中的默认参数#xff1a; 这是由于参数是在编译时压入 试题一 交换两个基类指针指向的对象的vf… 注visual studio复制当前行粘贴到下一行 CTRLD 杂项 调用子类重写的虚函数带默认参数但参数用的是基类的虚函数中的默认参数 这是由于参数是在编译时压入 试题一 交换两个基类指针指向的对象的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.w-s-a.com/news/470217/

相关文章:

  • 网站开发新手什么软件好网站设计师和ui设计师
  • 太仓苏州网站建设软件开发网站建设
  • 一个虚拟主机做2个网站吗工信部怎么查网站备案
  • 本地网站做淘宝客制作app步骤
  • 关于企业网站建设网页布局怎么设计
  • 惠州市网站设计公司裴东莞嘘网站汉建设
  • 长葛网站建站电子商务网站是什么
  • 泉做网站的公司太原网站建设开发公司
  • wordpress菜单栏的函数调用迅速上排名网站优化
  • 网站深圳广西模板厂哪家价格低
  • 搜索网站显示网页无法访问最好的网站推广
  • 巴彦淖尔市百家姓网站建设搬瓦工暗转wordpress
  • 温州鹿城区企业网站搭建云虚拟机
  • 网站的开发方法php网站商城源码
  • 旅游找什么网站好维护公司网站建设
  • 长春市长春网站制作站优化杭州企业推广网站
  • 网站建设开发设计营销公司山东网信办抓好网站建设
  • 斗图在线制作网站搜索关键词优化
  • 大连 网站建设 有限公司十大erp系统
  • 网站后台建设软件网络营销公司招聘
  • 做网站销售电销好做吗网站开发毕业设计代做
  • 成都学网站建设费用帝国cms与wordpress
  • 如何刷网站排名品牌设计的英文
  • 富阳有没有做网站的房产局官网查询系统
  • 建设网站列表aliyun oss wordpress
  • 做PPT的辅助网站wordpress拖拽式主题
  • 商城网站源码seo兼职58
  • 汽车租赁网站的设计与实现全网营销推广哪家正规
  • 做网站时怎么取消鼠标悬停如何设计软件界面
  • 建德网站设计公司中国十大热门网站排名