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

seo如何推广网站网站建设亮点

seo如何推广网站,网站建设亮点,滨州做网站的电话,wordpress网页怎么上传文章目录 虚函数的声明与定义代码演示基类Person派生类Man派生类Woman 测试代码动态绑定静态绑定访问私有虚函数总结一下通过成员函数指针调用函数的方式 虚函数的声明与定义 虚函数存在于C的类、结构体等中#xff0c;不能存在于全局函数中#xff0c;只能作为成员函数存在… 文章目录 虚函数的声明与定义代码演示基类Person派生类Man派生类Woman 测试代码动态绑定静态绑定访问私有虚函数总结一下通过成员函数指针调用函数的方式 虚函数的声明与定义 虚函数存在于C的类、结构体等中不能存在于全局函数中只能作为成员函数存在。 代码演示 基类Person Person.h #pragma once //定义一个Person类 class Person { public:virtual void speak();//声明一个虚成员函数(简称虚函数)virtual void eat();//声明一个虚成员函数(简称虚函数)void walk();//声明一个普通成员函数 };Person.cpp #include Person.h #include iostreamvoid Person::speak()//虚函数的定义前面不能加vitrual否则编译不过 {std::cout Person::speak std::endl; }void Person::eat()//虚函数的定义前面不能加vitrual否则编译不过 {std::cout Person::eat std::endl; }void Person::walk()//普通函数的定义 {std::cout Person::walk std::endl; }派生类Man Man .h #pragma once #include Person.h //定义一个类Man并继承Person类 class Man :public Person {//这个函数是重写了基类中的虚函数此时这个函数也是虚函数前面的virtual可以省略。void speak() override;//override 关键字只能用于虚函数,明确表明要重写基类的虚函数//virtual void speak() override;//等价于上面 };Man.cpp #include Man.h #include iostreamvoid Man::speak() {std::cout Man::speak std::endl; }派生类Woman Woman.h #pragma once #include Person.h //定义一个类Woman并继承Person类 class Woman :public Person {void speak() override; };Woman.cpp #include Woman.h #include iostream void Woman::speak() {std::cout Woman::speak std::endl; }含有虚函数的类在编译期间会生成一张虚函数表及虚表指针。虚函数表其实是一个指针数组里面的元素是虚函数地址。而续表指针指向虚函数表的首地址。也可以这么认为编译器给含有虚函数的类自动增加了一个 const void* pvtr 的指针成员变量。和一个静态的 static const void* vtable[]的指针数组;也就是说同一个类的虚函数表是共享的同一个类下不同对象的虚表指针指向的同一个虚函数表。 测试代码 #include Person.h #include Man.h #include Woman.h//test函数的声明 void test(Person* person); void test(Person person);int main(int argc, char* argv[]) {Person person;test(person);//传地址//test(person);Man man;test(man);//传地址//test(man);Woman woman1;test(woman1);//传地址Woman woman2;test(woman2);//传地址return 0; }//test函数的实现体现了多态 void test(Person* person)//指针传递 {person-speak();//person-eat();//person-walk(); }void test(Person p)//引用传递 {p.speak();p.eat();p.walk(); }打印结果 动态绑定 虚函数的好处就是体现了C中多态。即当基类类型的指针或引用 指向子类的对象时在调用虚函数时实际调用的虚函数是子类对象中的虚函数。 就像上面的test(Person* person)函数编译器在编译期间不确定函数内实际调用哪个类中的speak函数需要在实际代码执行时才能确定指针 person 到底指向的实际对象是哪个类的从而实现了动态绑定即多态性。 静态绑定 所有的类中的非虚成员函数都是静态绑定的。即在编译期间就确定了实际调用哪个函数。普通成员函数的实际调用者是根据代码里的调用者的类型来判断的即在编译期就能确定无法体现多态性。 注意:即使派生类没有重写基类中的虚函数也没有自己特有的虚函数。那么派生类就会继承父类中的虚函数即派生类也拥有虚函数表及虚表指针只是自己的虚函数表中的虚函数都是父类的虚函数除非自己重写过虚函数表中的基类虚函数地址会被替换为自己重写后的。 访问私有虚函数 我们把上方的代码修改一下 class Person { private:virtual void speak(){cout Person::speak endl;} public:virtual void eat(){cout Person::eat endl;} }class Woman : public Person { public:void eat(){cout Woman::eat endl;} };int main(int argc, char *argv[]) {Person person;//person.speak();//编译报错无法访问私有属性成员Woman woman;//woman.speak();//编译报错同上//void (Person:: *fun1)(void) Person::speak;//编译报错右值报错无法通过Person::speak获取函数地址。还是因为私有属性问题return 0; }我们想要在类的定义外部访问speak函数。通过常规的手段是访问不到的。 int main(int argc, char *argv[]) {typedef void (*Fun)(void);//给函数指针类型取别名Woman woman;Fun pfun1 (Fun)*((int*)*(int*)woman);Fun2 pfun2 (Fun)*((int*)*(int*)woman 1);//此时pfun2 将不再是一个被类作用域限制的成员函数的指针了而相当于一个全局函数的指针。pfun1();//输出结果Person::speakpfun2();//输出结果Woman::eatreturn 0; }分析一下上面的pfun1 和 pfun2 函数指针在执行时的输出结果。首先要明白一点含有虚函数的类在编译时创建的虚表指针变量会优化为类中第一个成员属性那么创建对象时虚表指针所占的内存地址和对象的地址是相同的。类似于 数组首元素的地址和数组名的关系。 上方的图中的有两处的地址为何可以转为(int )即int型指针因为地址值就是整型的。虚表指针vptr的值是地址虚函数表元素也是地址。 又因为指针的类型和指针所指向的地址存储的内容类型是关联的。另一处是转为Fun即函数指针。也是一个道理函数指针指向的地址即函数地址存储的是真实的函数。 (int)(int)woman //指针指向虚函数表中第一个元素 (int*)(int)woman 1 //指针指向虚函数表中第二个元素 注意这种方式能够获取私有虚函数的地址不能获取私有普通成员函数的地址。这也是虚函数的特殊实现原理优势的。 而且这种方式最后获取的虚函数指针不用再使用对象.* 或对象.-的动态方式来访问。直接 虚函数指针名(参数)来调用函数。 总结一下通过成员函数指针调用函数的方式 void (Woman:: *fun1)(void) Woman ::speak;//访问公共属性的成员普通函数或成员虚函数 Woman woman; (woman.*fun1)();//调用speak函数 Woman woman1 woman; (woman.-fun1)();//调用speak函数typedef void (*Fun)(void); Fun fun (Fun)*((int*)*(int*)woman);//访问公共成员虚函数或者私有成员函数 fun();//调用speak函数关于函数地址的相关博客类中成员函数及普通函数地址获取方式
http://www.zqtcl.cn/news/170793/

相关文章:

  • 网站模板 带手机端头条推广平台有哪些
  • 有没有专门做衣服的网站小程序加盟代理前景
  • app网站开发报价wordpress怎么加快网站打开速度
  • 路南网站建设可用的ftp网站
  • 台州市建站公司网站免费建设推荐
  • 网站世界排名怎么做柘城县网站建设
  • 网站设计与制作培训班户外运动网站建设策划
  • 保险公司网站网站域名注册哪个好
  • 平台网站建设可行报告工作室注册条件
  • 罗湖附近公司做网站建设哪家便宜做cpa必须要有网站吗
  • 深圳网站开发教程wordpress密码登录插件
  • 农机网站建设目标上海网站建设工资多少
  • 手机做网站过程网站名字做版权需要源代码吗
  • 公司微信网站建设方案现在做外贸前景如何
  • 如何使用微信公众号做网站河南省专业做网站公司
  • 清远市清城区网站建设公司广州黄浦区建设局网站
  • 站长做2个网站网站程序指的是什么
  • 网站建设jw100请拿笔记记下新域名
  • 兰州市住房保障和城乡建设局网站如何有效的推广网站
  • 网站推广做百度还是360北京企业网站建设费用
  • 推荐一个简单的网站制作策划方案免费网站
  • 用vs2012做网站案例企业现在有必要做网站吗
  • 网站建设少用控件wordpress默认分类
  • php网站是什么数据库文件网站开发收
  • 新网网站空间做网站和app哪类商标
  • drupal网站建设数据库厦门市网站建设
  • 解释微信微网站室内设计效果图展板
  • 教做发绳的网站游戏网站建设需要多少钱
  • 那个网站可以做双色球号码对比的网站设计好学吗
  • 网站建设如何获取客户韩国建筑网站