zoukankan      html  css  js  c++  java
  • 父类和子类的截断现象

    class Super
    {
        public:
            Super();
            virtual void someMether();
        protected:
            int mPritectedInt;
        private:
            int mPrivateInt;
    };
    
    class Sub : public Super
    {
        public:
            Sub();
            void someMether() override;    //重写父类的someMether方法 
            void someOtherMether();
        private:
            double mPrivateDouble;
    };

    当这样声明时:

    Sub mySub;

    Super super = mySub;

    super.someMether();  //这个调用的是Super类内的someMether();

    可以这样理解:Super是一个小盒子,Sub时一个大盒子,因为Sub继承了Super,所以在Sub里边就会有独属于自己的方法,比Super的范围大(为了方便理解,其实这么说是错误的),所以当Super super = mySub;时,就相当于将一个大盒子变成一个小盒子,导致派生类数据和重写丢失,这种现象称为截断(slicing)

    Super *p = new Sub;
    p->someMether();

    Sub mySub;
    Super &super = mySub;
    super.someMether();

    结果就是p和super都是调用的Sub里的重写函数someMether();

    顺便说一下禁止继承和重写的语法:

    1.禁止继承

    class Super final
    {
    public:
    Super();
    virtual void someMether();
    protected:
    int mPritectedInt;
    private:
    int mPrivateInt;
    };

    这就意味着Super是禁止其他类继承的。

    比如是:

    class Sub : public Super
    {
    public:
    Sub()
    void someOtherMether();
    private:
    double mPrivateDouble;
    };

    编译器会报错

    2禁止重写

    class Super
    {
    public:
    Super();
    virtual void someMether() final;
    protected:
    int mPritectedInt;
    private:
    int mPrivateInt;
    };

    class Sub : public Super
    {
    public:
    Sub();
    void someMether() override; //重写父类的someMether方法
    void someOtherMether();
    private:
    double mPrivateDouble;
    };

    加入final后重谢父类Super的void someMether() 程序会报错。

  • 相关阅读:
    理解JavaScript变量值
    理解基本包装类型Number,String,Boolean
    理解JavaScript原始类型和引用类型
    理解JavaScript数据类型
    右值引用
    C语言中内存对齐方式
    open/fopen read/fread write/fwrite区别
    UML类图几种关系的总结
    UML类图几种关系的总结
    宏应用缺点
  • 原文地址:https://www.cnblogs.com/boost/p/10338838.html
Copyright © 2011-2022 走看看