zoukankan      html  css  js  c++  java
  • C++ 的Virtual的用法

    1.虚函数

    类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Derived的print函数而不是Base的print函数。这是面向对象中的多态性的体现 

    基类的函数调用如果有virtual则根据多态性调用派生类的,如果没有virtual则是正常的静态函数调用,还是调用基类的

    class Base
    {
    public:Base(){}
    public:
           virtual void print(){cout<<"Base";}
    };
     
    class Derived:public Base
    {
    public:Derived(){}
    public:
           void print(){cout<<"Derived";}
    };
     
    int main()
    {
           Base *point=new Derived();
           point->print();
    } 

    Output:Derived

    2.纯虚函数:
    C++语言为我们提供了一种语法结构,通过它可以指明,一个虚拟函数只是提供了一个可被子类型改写的接口。但是,它本身并不能通过虚拟机制被调用。这就是纯虚拟函数(purevirtual function)。 纯虚拟函数的声明如下所示:
    class Query {
    public:
    // 声明纯虚拟函数
    virtual ostream& print( ostream&=cout ) const = 0;
    // ...
    };
    这里函数声明后面紧跟赋值0。

    包含一个或多个纯虚拟函数的类被编译器识别为抽象基类。抽象基类不能被实例化,一般用于继承。

    3.虚拟继承(virtual public)

    在多继承下,虚继承就是为了解决菱形继承中,B,C都继承了A,D继承了B,C,那么D关于 A的引用只有一次,而不是 普通继承的 对于A引用了两次……

    格式:可以采用public、protected、private三种不同的继承关键字进行修饰,只要确保包含virtual就可以了。

    class A
    {
      void f1(){};
    };
    class B : public virtual  A{
      
     void f2(){};
    };

    虚继承:在继承定义中包含了virtual关键字的继承关系;
    虚基类:在虚继承体系中的通过virtual继承而来的基类,

    了解下概念,至于虚基类的初始化、以及虚继承体系的进一步继承问题暂不讨论。

    (C++标准中(也是很自然的)选择在每一次继承子类中都必须书写初始化语句(因为每一次继承子类可能都会用来定义对象),而在最下层继承子类中实际执行初始化过程。所以上面在每一个继承类中都要书写初始化语句,但是在创建对象时,而仅  仅会在创建对象用的类构造函数中实际的执行初始化语句,其他的初始化语句都会被压制不调用。)

    详见:http://www.cppblog.com/chemz/archive/2007/06/12/26135.html

  • 相关阅读:
    AllowsTransparency和WebBrowser兼容性问题解决方案
    webbrowser和js交互小结
    wpf数据验证实例及常用方法小结
    Scrum 冲刺第一天
    Scrum 冲刺第二天
    1625 宝石项链 大视野评测
    1082栅栏 大视野评测
    bzoj 1606: [Usaco2008 Dec]Hay For Sale 购买干草
    1639 月度开支 大视野评测
    1650 跳石子 大视野评测
  • 原文地址:https://www.cnblogs.com/Yogurshine/p/2855654.html
Copyright © 2011-2022 走看看