• 继承(一)


    继承是一个具化的过程,父类的范围更大,子类的范围更小,父类时一个更广泛的概念,子类是一个更具体的概念。

    注意:在继承时有三种继承方式,分别是public ,protected ,private.

    public 的继承方式,成员在父类中的访问权限是什么样的,在子类中还是什么样的,

     1 class Base
     2 {
     3 public:
     4     int x;//在Base中是public,在Derived类中还是public
     5 protected:
     6     int y;//在Base中是protected,在Derived类中还是protected
     7 private:
     8     int z;//在Base中是private,在Derived类中还是private
     9 };
    10 
    11 class Derived :public Base
    12 {
    13 
    14 
    15 };

    protected 的继承,在基类中的public和protected ,继承到子类中都protected,   private的成员继承到子类中还是private

     1  1 class Base
     2  2 {
     3  3 public:
     4  4     int x;//在Base中是public,在Derived类中还是protected
     5  5 protected:
     6  6     int y;//在Base中是protected,在Derived类中还是protected
     7  7 private:
     8  8     int z;//在Base中是private,在Derived类中还是private
     9  9 };
    10 10 
    11 11 class Derived :protected Base
    12 12 {
    13 13 
    14 14 
    15 15 };

    private继承,无论基类成员的访问权限是什么,在派生类中都是private

     1 class Base
     2 {
     3 public:
     4     int x;//在Base中是public,在Derived类中还是private
     5 protected:
     6     int y;//在Base中是protected,在Derived类中还是private
     7 private:
     8     int z;//在Base中是private,在Derived类中还是private
     9 };
    10 
    11 class Derived :public Base
    12 {
    13 
    14 
    15 };

    类接口:类中的共有的(public)成员函数称为接口

    公有继承中,基类的public成员函数被继承到派生类,还是public的,换句话说,基类的接口被继承到了派生类,成为了派生类的接口,故公有继承也称作接口继承。

    在非公有继承中,基类的接口被继承到派生类,但是在派生类中的访问权限是,protected,或是private的,不再是类的接口,派生类只是想重用基类的实现而已,故非公有继承被称作实现继承。

    在继承中,会出现隐藏,就是子类中的函数,会对基类中的同名函数进行隐藏,但是要注意,子类中对基类的同名函数隐藏。当基类中的函数不是虚函数时,可以通过在子类中对同名的函数修改参数,或者返回值来隐藏基类中的函数,但是基类中的函数是虚函数,就不能仅仅修改返回值了,还要修改参数。

    #include<iostream>
    #include<string>
    using namespace std;
    
    class Base
    {
    public:
        int m_X;
        void print()const
        {
            cout << "Base::m_X:" << m_X << endl;
        }
    };
    
    class Derived :public Base
    {
    public:
        int m_X;
        void print(int)const
        {
            cout << "Derived::m_X:" << m_X << endl;
        }
        int print(int ,int)
        {
    
        }
        int print()const//这里要特别注意,基类中的返回值是void,而这个子类中的函数只改变了基类的返回值,因为基类中的void print()const;函数不是虚函数,所以不会报错,如果基类中的void print()const函数是虚函数,这里就会报错。当然如果不想程序报错,就把参数也修改了
        {
        }
    };
    int main()
    {
        Derived d;
        int a=0;
        d.m_X = 10;
        //d.print();  //Error:这样会出现错误,Derived::print()函数不接受0个参数
                     //说明,Derived类中的print(int)函数把积累中的基类中的print()给隐藏了。
        d.print(a);
        d.Base::m_X = 100;//因为子类中含有和基类成同名的成员变量和成员函数,故把基类中的成员变量和成员函数给隐藏了
        d.Base::print();//但是,基类中的成员变量和成员函数还是被继承到了子类中,所以通过特殊的方法函数可以访问基类的
                       //成员变量和成员函数
        return 0;
    }
  • 相关阅读:
    java 多线程 this
    sping PropertyPlaceholderConfigurer
    dubbo 各功能模块介绍及配置方式
    dubbo配置概述
    struts2 之 【struts2简介,struts2开发步骤,struts2详细配置,struts2执行流程】
    曾经,真的很喜欢你
    Arcgis for Javascript 对接iServer发布的Mapserver服务
    SuperMap iClient for JavaScript image出图
    SuperMap-iServer过滤请求返回值
    tomcat闪退解决
  • 原文地址:https://www.cnblogs.com/cplinux/p/5770739.html
Copyright © 2020-2023  润新知