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

乐东黎族自治县网站建设_网站建设公司_关键词排名_seo优化

黔南州建设局门户网站,深圳做营销网站建设,做有关兼职网站的需求分析,php视频网站怎么做关于virtual关键字的用法总结如下#xff0c;有错误或者总结不到位的情况请能帮本人指出#xff0c;非常感谢#xff01; Virtual是C OO机制中很重要的一个关键字。只要是学过C的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数。 基类的函数调用如果有virtual则…关于virtual关键字的用法总结如下有错误或者总结不到位的情况请能帮本人指出非常感谢 Virtual是C OO机制中很重要的一个关键字。只要是学过C的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数。 基类的函数调用如果有virtual则根据多态性调用派生类的如果没有virtual则是正常的静态函数调用还是调用基类的。 1、虚函数的应用 看下面的一段代码的输出结果 class Base { public:Base(){} public:        virtual void print(){coutBase;} };   class Derived:public Base { public:Derived(){} public:        void print(){coutDerived;} };   int main() {        Base *pointnew Derived();        point-print(); } Output Derived  这也许会使人联想到函数的重载但稍加对比就会发现两者是完全不同的 1重载的几个函数必须在同一个类中 覆盖的函数必须在有继承关系的不同的类中 2覆盖的几个函数必须函数名、参数、返回值都相同 重载的函数必须函数名相同参数不同。参数不同的目的就是为了在函数调用的时候编译器能够通过参数来判断程序是在调用的哪个函数。这也就很自然地解释了为什么函数不能通过返回值不同来重载因为程序在调用函数时很有可能不关心返回值编译器就无法从代码中看出程序在调用的是哪个函数了。 3覆盖的函数前必须加关键字Virtual 重载和Virtual没有任何瓜葛加不加都不影响重载的运作。 再看下面林瑞博士讲解的一段关于关键字Virtual的用法 #include iostream.h class Base { public: virtual void f(float x){ cout Base::f(float) x endl; } void g(float x){ cout Base::g(float) x endl; } void h(float x){ cout Base::h(float) x endl; } };   class Derived : public Base { public: virtual void f(float x){ cout Derived::f(float) x endl; } void g(int x){ cout Derived::g(int) x endl; } void h(float x){ cout Derived::h(float) x endl; } };   void main(void) { Derived d; Base *pb d; Derived *pd d; // Good : behavior depends solely on type of the object pb-f(3.14f); // Derived::f(float) 3.14 pd-f(3.14f); // Derived::f(float) 3.14 // Bad : behavior depends on type of the pointer pb-g(3.14f); // Base::g(float) 3.14 pd-g(3.14f); // Derived::g(int) 3 (surprise!) // Bad : behavior depends on type of the pointer pb-h(3.14f); // Base::h(float) 3.14 (surprise!) pd-h(3.14f); // Derived::h(float) 3.14 }   bp 和dp 指向同一地址按理说运行结果应该是相同的而事实上运行结果不同所以他把原因归结为C的隐藏规则其实这一观点是错的。决定bp和dp调用函数运行结果的不是他们指向的地址而是他们的指针类型。“只有在通过基类指针或引用间接指向派生类子类型时多态性才会起作用”(C Primer 3rd Edition)。pb是基类指针pd是派生类指针pd的所有函数调用都只是调用自己的函数和多态性无关所以pd的所有函数调用的结果都输出Derived::是完全正常的pb的函数调用如果有virtual则根据多态性调用派生类的如果没有virtual则是正常的静态函数调用还是调用基类的所以有virtual的f函数调用输出Derived::其它两个没有virtual则还是输出Base::很正常啊nothing surprise!  所以并没有所谓的隐藏规则虽然《高质量C/C 编程指南》是本很不错的书可大家不要迷信哦。记住“只有在通过基类指针或引用间接指向派生类子类型时多态性才会起作用”。 2、纯虚函数 纯虚函数定义如下 C语言为我们提供了一种语法结构通过它可以指明一个虚拟函数只是提供了一个可被子类型改写的接口。但是它本身并不能通过虚拟机制被调用。这就是纯虚拟函数purevirtual function。 纯虚拟函数的声明如下所示 class Query { public: // 声明纯虚拟函数 virtual ostream print( ostreamcout ) const 0; // ... }; 这里函数声明后面紧跟赋值0。 包含一个或多个纯虚拟函数的类被编译器识别为抽象基类。抽象基类不能被实例化一般用于继承。抽象基类只能作为子对象出现在后续的派生类中 3、 虚拟继承virtual public 在多继承下虚继承就是为了解决菱形继承中B,C都继承了AD继承了B,C那么D关于 A的引用只有一次而不是 普通继承的 对于A引用了两次…… 格式可以采用public、protected、private三种不同的继承关键字进行修饰只要确保包含virtual就可以了。 class A {void f1(){}; }; class B : public virtual A{void f2(){}; }; 虚继承在继承定义中包含了virtual关键字的继承关系虚基类在虚继承体系中的通过virtual继承而来的基类#include  using namespace std; class Person{    public:    Person(){ coutPerson构造ENDL; }            ~Person(){ coutPerson析构ENDL; } }; class Teacher : virtual public Person{    public:    Teacher(){ coutTeacher构造ENDL; }             ~Teacher(){ outTeacher析构ENDL; } }; class Student : virtual public Person{   public:      Student(){ coutStudent构造ENDL; }              ~Student(){ coutStudent析构ENDL; } }; class TS : public Teacher,  public Student{ public:            TS(){ coutTS构造ENDL; }                  ~TS(){ coutTS析构ENDL; } }; int main(int argc,char* argv[]) { TS ts; return 0; } 这段代码的终端输出结果为 Person构造 Teacher构造 Student构造 TS构造 TS析构 Student析构 Teacher析构 Person析构 当Teacher类和Student类没有虚继承Person类的时候也就是把virtual去掉时候终端输出的结果为 Person构造 Teacher构造 Person构造 Student构造 TS构造 TS析构 Student析构 Person析构 Teacher析构 Person析构 大家可以很清楚的看到这个结果明显不是我们所期望的。我们在构造TS的时候需要先构造他的基类也就是Teacher类和Student类。而Teacher类和Student类由都继承于Person类。这样就导致了构造TS的时候实例化了两个Person类。同样的道理析构的时候也是析构了两次Person类这是非常危险的也就引发出了virtual的第三种用法虚析构。 关于虚继承的相关功能本人也是一知半解后续再做深入的研究
http://www.lebaoying.cn/news/105966.html

相关文章:

  • 地方汽车网站模板购买网页版qq农场
  • 网站被模仿环保工程网站建设价格
  • 深圳优秀网站建设网站正在建设中的图片素材
  • 深圳做电商平台网站建设做调查问卷网站
  • 扬州市城乡建设局网站网站开发公司怎么接单子
  • 上海网站建设的英文WordPress寻主题
  • 查看网站 vps工作服厂家无锡 帛裳服饰专业
  • 做网站框架可用jpg图吗wordpress导航加图标
  • 国内精美网站界面网址discuz 网站风格
  • 网站 建设需免插件WordPress对接公众号
  • 个人网站做淘宝客犯法吗app设计流程
  • 网站优化排名分享隐迅推u nas 建设网站
  • 公司网站建设怎么协调内容与保密海口发布公众号
  • 网站每年的维护费校园门户网站开发需求
  • 甘肃省建设厅网站资质升级公示业务员怎样找客户 新手
  • 网站设计风格评价浙江城乡住房建设厅网站
  • 主体备案与网站备案网站建设公司推销
  • 淘宝网站怎么做的好坏做盗版网站的
  • 建站之星成品网站源码网站建设目标及需求分析
  • 雄安优秀网站建设方案大连市建设网
  • 游戏开发入门惠州seo计费
  • 网站建设走什么科目网站建设感谢信
  • 建设银行网站背景做网站四百全包
  • 浙江省网站重点学科建设网站的设计与实现
  • 网站一般宽度企业网站翻译
  • 网站建设明细报价表 xls家装在线设计平台
  • 本地做网站贵球球是哪个公司开发的
  • 网站建设的上机报告wordpress 文章 目录
  • 在线营销型网站制作广州网站推广模板
  • 手机网站 普通网站在线课堂手机网站模板