zoukankan      html  css  js  c++  java
  • c++中的虚函数

    父类 FC  FatherClass   子类 SC   SonClass

      

    一 ,虚函数

    C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现子类可以重写父类的虚函数实现子类的特殊化。

      如下就是一个父类中的虚函数:

    class FC
    {
    public:
        virtual void out2(string s)
        {
            cout<<"A(out2):"<<s<<endl;
        }
    };
    

    二 ,纯虚函数  

      C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。

      C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。

      C++中的纯虚函数也是一种“运行时多态”。

      如下面的类包含纯虚函数,就是“抽象类”:

    class FC
    {
    public:
        virtual void out1(string s)=0;
        virtual void out2(string s)
        {
            cout<<"A(out2):"<<s<<endl;
        }
    };
    

     三 ,普通函数

      普通函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”类对象,调用自己的普通函数

      普通函数是父类为子类提供的“强制实现”。

      因此,在继承关系中,子类不应该重写父类的普通函数,因为函数的调用只和类对象的字面值有关。

    实例

    在类对象的定义中,有四种组合,

    1. FC fc=new FC;
    2. FC fc = new SC;
    3. SC sc=new SC;
    4. SC sc =new FC;

    其中 4 是错误的,不允许将一个父类对象,赋值给子类对象。

    但允许,将一个子类对象,赋值给父类对象,如1 中所示。

    当然不,这里的列子 在3中也是不成立的,因为如果FC中包含纯虚函数,那么其实一个抽象类,不能使用抽象类来new 一个对象、

    验证程序,如下:

     1 //============================================================================
     2 // Name        : vf.cpp
     3 // FCuthor      : lian
     4 // Version     :
     5 // Copyright   : Your copyright notice
     6 // Description : Hello World in C++, FCnsi-style
     7 //============================================================================
     8 
     9 #include <iostream>
    10 using namespace std;
    11 
    12 
    13 class FC
    14 {
    15 public:
    16     virtual void out1()=0;  ///由子类实现
    17     virtual ~FC(){};
    18     virtual void out2() ///默认实现
    19     {
    20         cout<<"FC(out2)"<<endl;
    21     }
    22     void out3() ///强制实现
    23     {
    24         cout<<"FC(out3)"<<endl;
    25     }
    26 };
    27 
    28 class SC:public FC
    29 {
    30 public:
    31     virtual ~SC(){};
    32     void out1()
    33     {
    34         cout<<"SC(out1)"<<endl;
    35     }
    36     void out2()
    37     {
    38         cout<<"SC(out2)"<<endl;
    39     }
    40     void out3()
    41     {
    42         cout<<"SC(out3)"<<endl;
    43     }
    44 };
    45 
    46 int main()
    47 {
    48     FC *fs=new SC;
    49     fs->out1();
    50     fs->out2();
    51     fs->out3();
    52     cout<<"************************"<<endl;
    53     SC *ss=new SC;
    54     ss->out1();
    55     ss->out2();
    56     ss->out3();
    57 
    58     delete fs;
    59     delete ss;
    60     return 0;
    61 }

    在Line 51中 fs->out3,这里是普通函数,只会根据指针或引用的“字面值”类对象,调用自己的普通函数

    所以其调用父类的普通函数,输出 FC(out3)

    程序的输出结果为

    SC(out1)
    SC(out2)
    FC(out3)
    ************************
    SC(out1)
    SC(out2)
    SC(out3)
    

      

     

  • 相关阅读:
    《Java并发编程的艺术》 第9章 Java中的线程池
    《Java并发编程的艺术》第6/7/8章 Java并发容器与框架/13个原子操作/并发工具类
    java锁总结
    《Java并发编程的艺术》第5章 Java中的锁 ——学习笔记
    《Java并发编程的艺术》第4章 Java并发编程基础 ——学习笔记
    Java并发编程的艺术(一、二章) ——学习笔记
    redis缓存使用SpringDataRedis
    商城06——solr索引库搭建&solr搜索功能实现&图片显示问题解决
    商城05——首页轮播图显示实现&Redis环境搭建&Redis实现缓存
    商城04——门户网站介绍&商城首页搭建&内容系统创建&CMS实现
  • 原文地址:https://www.cnblogs.com/jiudianren/p/5641644.html
Copyright © 2011-2022 走看看