C++学习五:类继承、基类(父类)和派生类(子类)、公有继承(public继承)、私有继承(private继承)、保护继承(protected继承)、子类构造函数和析构函数、is-a、has-a关系。

一.类继承

1.概念

    用已有的类来建立专用类的编程技术;

2.目的

    实现代码重用

3.父类/基类 和  子类/派生类

    父类:已有的类叫父类,是抽象类

    子类:由基类派生出来的类叫派生类/子类,是父类的具体化

派生类的构造函数一般有3项工作要完成:首先 基类初始化 ,其次 成员对象初始化,最后 执行派生类构造函数体

4.语法形式

    class 子类名 : 权限限定符 基类名1, 权限限定符 基类名2....

    {

        //class body

    };

       eg1:public继承

         //子类:public继承
        //基类的public成员 -> 子类的public成员
        //基类的protected成员 -> 子类的protected成员
        //基类的private成员只能通过基类的接口访问

        //public继承
        class Base{
            public:
                Base(int val = 0) : val(val)
                {
                    cout << __func__ << ":" << __LINE__ << endl;
                }
                ~Base()
                {
                    cout << __func__ << ":"<<__LINE__ << endl;
                }
                int getval() const;
            protected:
                void setval(int);
            private:
                int val;
        };
        void Base::setval(int val)
        {
            this->val = val;
        }
        int Base::getval() const
        {
            return this->val;
        }
        //子类:public继承
        //基类的public成员 -> 子类的public成员
        //基类的protected成员 -> 子类的protected成员
        //基类的private成员只能通过基类的接口访问
        class Inherit : public Base{
            public:
                Inherit(int val=0);
                ~Inherit();
            public:
                void setmyval(int);
                int getmyval() const;
            private:
                int myval;
        };

        Inherit::Inherit(int val) : myval(val)
        {
            cout << __func__ << ":" << __LINE__ << endl;
        }
        Inherit::~Inherit()
        {
            cout << __func__ << ":" << __LINE__ << endl;
        }
        void Inherit::setmyval(int v)
        {
            setval(v);//基类的protected成员在子类的访问权限是protected
            //val++;//基类的private成员只能通过基类接口访问
            this->myval = v;
        }
        int Inherit::getmyval() const
        {
            return this->myval;
        }
        int main()
        {  
            Inherit obj;
            cout << sizeof obj << endl;
            //obj.setval(666);//protected成员只能在类内部或子类内部访问
            obj.setmyval(888);
            cout << obj.getval() << endl;
            return 0;
        }

           

    eg2:protected继承

        //子类:protected继承
        //基类的public成员 -> 子类的protected成员
        //基类的protected成员 -> 子类的protected成员
        //基类的private成员只能通过基类的接口访问

class Base{
            public:
                Base(int val = 0) : val(val)
                {
                   cout << __func__ << ":" << __LINE__ << endl;
                }
                ~Base()
                {
                    cout << __func__ << ":"<<__LINE__ << endl;
                }
                int getval() const;
            protected:
                void setval(int);
            private:
                int val;
        };

        void Base::setval(int val)
        {
            this->val = val;
        }
        int Base::getval() const
        {
            return this->val;
        }
        //子类:protected继承
        //基类的public成员 -> 子类的protected成员
        //基类的protected成员 -> 子类的protected成员
        //基类的private成员只能通过基类的接口访问
        class Inherit : protected Base{
            public:
                Inherit(int val=0);
                ~Inherit();
            public:
                void setmyval(int);
                int getmyval() const;
            private:
                int myval;
        };
        Inherit::Inherit(int val) : myval(val)
        {
            cout << __func__ << ":" << __LINE__ << endl;
        }
        Inherit::~Inherit()
        {
            cout << __func__ << ":" << __LINE__ << endl;
        }
        void Inherit::setmyval(int v)
        {
            setval(v);//基类的protected成员在子类的访问权限是protected
            cout << getval() << endl;
            //val++;//基类的private成员只能通过基类接口访问
            this->myval = v;
        }
        int Inherit::getmyval() const
        {
           return this->myval;
        }
        int main()
        { 
            Inherit obj;
            cout << sizeof obj << endl;
            //obj.setval(666);//protected成员只能在类内部或子类内部访问
            obj.setmyval(888);
            //cout << obj.getval() << endl;//protected继承:基类的public在子类的访问权限?
            return 0;
        }

       

    eg3:private继承

       //子类:private继承
        //基类的public成员 -> 子类的private成员
        //基类的protected成员 -> 子类的private成员
        //基类的private成员只能通过基类的接口访问

class Base{

            public:
                Base(int val = 0) : val(val)
                {
                    cout << __func__ << ":" << __LINE__ << endl;
                }
                ~Base()
                {
                    cout << __func__ << ":"<<__LINE__ << endl;
                }
                int getval() const;
            protected:
                void setval(int);
            private:
                int val;
        };
        void Base::setval(int val)
        {
            this->val = val;
        }
        int Base::getval() const
        {
            return this->val;
        }
        //子类:private继承
        //基类的public成员 -> 子类的private成员
        //基类的protected成员 -> 子类的private成员
        //基类的private成员只能通过基类的接口访问
class Inherit : private Base{
            public:
                Inherit(int val=0);
                ~Inherit();
            public:
                void setmyval(int);
                int getmyval() const;
            private:
                int myval;
        };
        Inherit::Inherit(int val) : myval(val)
        {
            cout << __func__ << ":" << __LINE__ << endl;
        }

        Inherit::~Inherit()
        {
            cout << __func__ << ":" << __LINE__ << endl;
        }
        void Inherit::setmyval(int v)
        {
            setval(v);//基类的protected成员在子类的访问权限是protected
            cout << getval() << endl;
            //val++;//基类的private成员只能通过基类接口访问
            this->myval = v;
        }
        int Inherit::getmyval() const
        {
            return this->myval;
        }
        int main()
        {  
            Inherit obj;
            cout << sizeof obj << endl;
            //obj.setval(666);//protected成员只能在类内部或子类内部访问
            obj.setmyval(888);
            //cout << obj.getval() << endl;//protected继承:基类的public在子类的访问权限?
            return 0;
        }

       

    总结:

        1)public继承

            基类的public成员 -> 子类的public成员

            基类的protected成员 -> 子类的protected成员

            基类的private成员只能通过基类的接口访问

        2)protected继承

            基类的public成员 -> 子类的protected成员

            基类的protected成员 -> 子类的protected成员

            基类的private成员只能通过基类的接口访问

        3)private继承

            基类的public成员    -> 子类的private成员

            基类的protected成员 -> 子类的private成员

            基类的private成员只能通过基类的接口访问

 二.子类构造函数和析构函数

1.注意

    构造函数和析构不能够被继承;

    每个类都有自己的构造和析构

2.顺序

    先构造基类对象,再构造子类对象

    先析构子类对象,再析构基类对象

三.is-a关系

描述继承关系,即派生类一定是基类的一种

例:水果有香蕉,水果类和香蕉类之间就是is-a关系

四.has-a关系

用来描述组合关系

例如:午餐有水果,午餐类和水果类之间的关系就是has-a关系

五.多重继承

1.语法形式

    class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…

    {

          <派生类类体>

    };

    eg:       

class Man{
        public:
            Man()
            {
                cout << __func__ << ":" << __LINE__ << endl;
            }
            ~Man()
            {
                cout << __func__ << ":" << __LINE__ << endl;
            }
        public:
            void prnmsg()
            {
                cout << __func__ << ":" << __LINE__ << endl;
            }
        };       
class Wolf{
        public:
            Wolf()
            {
                cout << __func__ << ":" << __LINE__ << endl;
            }
            ~Wolf()
            {
                cout << __func__ << ":" << __LINE__ << endl;
            }
        };

        //多重继承
class WolfMan : public Man, public Wolf{
        public:
            WolfMan()
            {
                cout << __func__ << ":" << __LINE__ << endl;
            }
            ~WolfMan()
            {
                cout << __func__ << ":" << __LINE__ << endl;
            }
        };
        int main()
        {
            WolfMan obj;
            return 0;

        }

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++中的继承性质是指一个可以从另一个继承属性和方法,并且可以通过继承来创建新的。这种关系被称为父类子类之间的继承关系。 在C++中,继承有三种型:公有继承私有继承保护继承。下面我会详细介绍每种继承型的性质: 1. 公有继承public inheritance): - 公有继承是最常见的一种继承方式。 - 在公有继承中,基类公有成员和保护成员都会成为派生类的成员,私有成员则不会被继承。 - 公有继承允许通过派生类访问基类公有成员和保护成员。 2. 私有继承private inheritance): - 私有继承是一种较少使用的继承方式。 - 在私有继承中,基类公有成员、保护成员和私有成员都会成为派生类私有成员。 - 私有继承限制了通过派生类访问基类成员的权限。 3. 保护继承protected inheritance): - 保护继承也是一种较少使用的继承方式。 - 在保护继承中,基类公有成员和保护成员都会成为派生类保护成员,私有成员不会被继承。 - 保护继承允许通过派生类访问基类保护成员,但不允许通过派生类的对象访问。 无论是哪种继承型,派生类都可以重写基类的方法,实现自己的版本。这个过程被称为函数重写(函数覆盖)。 需要注意的是,C++支持多重继承,也就是一个派生类可以从多个基类继承属性和方法。这样可以在一个派生类中集成多个父类的特性,但也需要小心处理可能出现的命名冲突问题。 希望这些解释能帮助你更好地理解C++中的继承性质。如果你有更多问题,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值