zoukankan      html  css  js  c++  java
  • C++——类的继承(派生)

    类的继承就是子类可以拥有父类的成员变量和成员函数

    //public 修饰的成员变量 方法 在类的内部 类的外部都能使用
    //protected: 修饰的成员变量方法,在类的内部使用 ,在继承的子类中可用 ;其他 类的外部不能被使用
    //private: 修饰的成员变量方法 只能在类的内部使用 不能在类的外部。子类可以继承,但不能使用

    类的调用语法

    class Parent
    {
    public:
                int a; 
    protected:
                int b; 
    private:
                int c; 
    };
    
    
    
    class Child : protected Parent
    {
    public:
    protected:
    private:
    
    };

    一、不同的继承方式会改变继承成员的访问属性

    1)C++中的继承方式会影响子类的对外访问属性

    public继承:父类成员在子类中保持原有访问级别

    private继承:父类成员在子类中变为private成员

    protected继承:父类中public成员会变成protected

                                父类中protected成员仍然为protected

                                父类中private成员仍然为private

    2)private成员在子类中依然存在,但是却无法访问到。不论种方式继承基类,派生类都不能直接使用基类的私有成员

    3)C++中子类对外访问属性表

    父类成员访问级别

    public

    proteced

    private

    public

    public

    proteced

    private

    proteced

    proteced

    proteced

    private

    private

    private

    private

    Private

    二、兼容性原则


    /*
    兼容规则中所指的替代包括以下情况:
    1)子类对象可以当作父类对象使用
    2)子类对象可以直接赋值给父类对象
    3)子类对象可以直接初始化父类对象
    4)父类指针可以直接指向子类对象
    5)父类引用可以直接引用子类对象
    */

    #include <iostream>
    using namespace std;
    
    class Parent
    {
    public:
        void printP()
        {
            cout<<"我是爹..."<<endl;
        }
    
        Parent()
        {
            cout<<"parent构造函数"<<endl;
        }
    
        Parent(const Parent &obj)
        {
            cout<<"copy构造函数"<<endl;
        }
    
    private:
        int a;
    };
    
    class child : public Parent
    {
    public:
        void printC()
        {
            cout<<"我是儿子"<<endl;
        }
    protected:
    private:
        int c;
    };
    
    
    
    
    
    //C++编译器 是不会报错的 .....
    void howToPrint(Parent *base)
    {
        base->printP(); //父类的 成员函数 
    
    }
    
    void howToPrint2(Parent &base)
    {
        base.printP(); //父类的 成员函数 
    }
    void main()
    {
        //
    
        Parent p1;
        p1.printP();
    
        child c1;
        c1.printC();
        c1.printP();
    
    
        //赋值兼容性原则 
        //1-1 基类指针 (引用) 指向 子类对象
        Parent *p = NULL;
        p = &c1;
        p->printP();  
    
        //1-2 指针做函数参数
    
        howToPrint(&p1);
        howToPrint(&c1); 
    
        //1-3引用做函数参数
        howToPrint2(p1);
        howToPrint2(c1); 
    
    
        //第二层含义
    
        //可以让子类对象   初始化   父类对象
        //子类就是一种特殊的父类
        Parent p3 = c1;
    
    
        cout<<"hello..."<<endl;
        system("pause");
        return ;
    }

     

    三、继承中的构造析构调用原则

             原则:    先构造父类,再构造成员变量、最后构造自己

                              先析构自己,在析构成员变量、最后析构父类

                              //先构造的对象,后释放

    四、继承中的同名成员变量处理方法

    1、当子类成员变量与父类成员变量同名时

    2、子类依然从父类继承同名成员

    3、在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员,显式地使用类名限定符

    4、同名成员存储在内存中的不同位置

  • 相关阅读:
    jquery编写插件的方法
    $.extend()的深拷贝和浅拷贝详细讲解
    jquery实现表格的搜索功能
    网页中tab标签切换分别用jquery和javascript源码实现
    JavaScript和jQuery的类型判断
    chrome jssip
    APiCloud学习
    vue生命周期、钩子函数
    闭包、作用域、原型小知识点等面试小知识点
    前后端分离
  • 原文地址:https://www.cnblogs.com/long5683/p/11401231.html
Copyright © 2011-2022 走看看