c++继承

class A
{

};
class B :public A
{


};

上面是继承的基本写法

继承方式:
public:公有继承,不改变基类的成员可见性(在本类中所继承的基类的那些成员,可见性不变),
public-->public
protected--->protected
private--->private


protected:保护继承,基类的public成员变成本类protected成员,其它的不变.
private:私有继承,基类的public和protected成员变成本类私有成员,其它的不变.
        此处很微妙,在子类中仍然可以访问父类的public和protected成员.
        只有孙类不能访问.

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

子类构造对象时会先调用父类构造函数

析构函数先调用自己的,再调用父类

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

子类重写父类函数

#include <iostream>
using namespace std;


/*
覆盖:在子类中重写父类的成员函数.
覆盖的函数函数名相同,参数可以不同.
*/

/*父类*/
class Animal
{
    public:
    void eat()
    {
     cout<<"进食中...."<<endl;
    }

};

/*子类*/

class Bird: public Animal
{
    public:
    //
    void eat(int i)
    {
        cout<<"啄食中..."<<"啄"<<i<<"次"<<endl;
    }  

};

int main(void)
{
    /*在main里面调用的类成员,都算是外界*/
    Bird bird1; //1字节
    bird1.eat(5);

}
重写例2

#include <iostream>
using namespace std;


/*
覆盖:在子类中重写父类的成员函数.
覆盖的函数函数名相同,参数可以不同.


*/

/*父类*/
class Animal
{
    public:
    void eat()
    {
     cout<<"进食中...."<<endl;
    }

};

/*子类*/

class Bird: public Animal
{
    public:
    //
    void eat()
    {
        cout<<"啄食中..."<<endl;
    }  

};

int main(void)
{
    /*在main里面调用的类成员,都算是外界*/
    Bird bird1; //多少字节?
    bird1.eat();
    bird1.Animal::eat();///调用基类的函数

    Animal a=bird1; //子类强制转换成父类对象
    a.eat();//调用父类的eat
    Animal *p=&bird1; //父类指针指向子类对象
    p->eat();调用父类的eat

    Animal &b=bird1; //父类的引用指向子类对象
    b.eat();//调用父类的eat

    //Bird bird2=a;  //父类对象无法强制转成子类

}
虚继承

#include <iostream>
using namespace std;

/*
在多重继承中,如果两个父类都继承了同一个爷爷类,那子类会存有爷爷类的两份数据,
但是希望只用一份数据.这时候可以使用虚基类.
让两个父类虚继承爷爷类.
用class <父类名>: virtual public <爷爷类名>
在孙子类的构造函数中必须另外显式调用爷爷类的构造函数
*/


class GrandPa
{
    public:
    GrandPa(int _data):data(_data){}
    int data;
};

class A:virtual public GrandPa //虚继承是不完整的,子类还要初始化爷爷的数据
{
    public:
    A(int _data):GrandPa(_data){}
    //拥有int data这个成员
};
class B:virtual public GrandPa
{
    //拥有int data这个成员
    public:
     B(int _data):GrandPa(_data){}
};

class C:virtual public GrandPa
{
    //拥有int data这个成员
    public:
     C(int _data):GrandPa(_data){}
};


class GrandSon:public A,public B,public C
{
    public:
    //相当于我独立地继承了爷爷的数据
    GrandSon(int _data):A(_data),B(_data),C(_data),GrandPa(_data){}
    //有几个成员?
};


int main(void)
{
    GrandSon gs(88);
    gs.data=99;//请问是赋值给哪个data??
    gs.A::data=100;
    gs.B::data=108;

    cout<<gs.data<<endl;  
    cout<<sizeof(gs)<<endl;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值