• 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

  • 相关阅读:
    软件质量保证(SQA)
    软件质量保证(SQA)
    在应用程序中使用 Ajax 的时机
    3月18日工作日志88250
    Eclipse 4.0计划
    3月15日工作日志88250
    Eclipse 4.0计划
    3月18日工作日志88250
    在应用程序中使用 Ajax 的时机
    3月15日工作日志88250
  • 原文地址:https://www.cnblogs.com/Yogurshine/p/2855654.html
Copyright © 2020-2023  润新知