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;
}