公有继承
在派生类中,基类的公有成员和保护成员被继承后分别作为派生类的公有和保护成员,而且不能访问基类的私有成员
public:在类外部可以访问
protected:在类内部可以访问
private:类外部内部均不可访问
#include<iostream>
using namespace std;
class Person
{
public:
int m,n;
void set(int a,int b)
{
m=a;
n=b;
}
void show()
{
cout<<m<<endl;
cout<<n<<endl;
}
private:
int k;
};
class STU:public Person
{
private:
int d;新增成员
public:
void set1(int a,int b,int c)
{
set(a,b);//吸收基类成员函数
d=c;
show();
cout<<c<<endl;
}
};
int main()
{
STU s1;
s1.set1(1,2,3);
return 0;
}
保护继承
在派生类中,基类的公有成员和保护成员被继承后分别作为派生类保护成员,而且不能访问基类的私有成员
public:可在类中访问
protected:可在类中访问
private:不可在类中访问
均以private身份出现在派生类中,派生类函数可以访问public和protected
私有继承
public:可在类中访问
protected:可在类中访问
private:不可在类中访问
均以private身份出现在派生类中,派生类函数可以访问public和protected
多继承
一个类有两个及以上的父类,称之为 多继承
同名隐藏
基类中继承下来的函数,与派生类中的同名函数不能形成重载,而且同名函数还会发生冲突。如果访问相同名称的函数,派生类中只能调用自己类中的函数或者成员。如果想在派生类中访问基类中的同名(成员函数||成员变量)。只能通过加基类类作用域的方式去访问相同名称的基类成员。
派生类对象构造函数
派生类对象构造时,先调用派生类构造函数,在派生类构造函数的初始化列表中会调用基类的构造函数,在进入派生类对象的函数体之前,会先在初始化列表中完成派生类中成员的初始化,而这个初始化列表中就有基类的初始化,因此它会先初始化基类中成员(构造基类成员,调用基类的构造函数),之后再初始化派生类的成员。
默认的派生类构造函数只会调用基类的默认构造函数。所以基类的构造函数如果是定义的有参数的,这时必须在派生类的构造函数初始化列表中给出定义。否则构造派生类对象时,找不到默认的基类构造函数,代码不能编译。
派生类的析构函数
(先析构自己的,在最后一个括号处调用基类的析构函数)
如果要销毁派生类的对象,则需要掉用派生类析构函数来清理派生类对象中的资源,在派生类析构函数的最后,需要调用基类的析构函数,以完成基类部分资源的销毁。
虚基类(虚拟继承)
为了解决继承地二义性问题,设计出了虚基类。其实为了防止在派生类中出现访问冲突,可以通过基类名加成员名进行限定访问,但这样比较麻烦,所以干脆采用虚基类。
虚拟继承使得从不同路径继承地同名数据在派生类中只产生一个副本。
定义方式:
class 派生类名:virtual 继承方式 基类名
{
}
赋值兼容
1.基类的对象等于派生类的对象
2.基类的指针指向基类对象
3.基类的指针指向派生类的对象
4.基类的引用等于基类的对象
5.基类的引用等于派生类的对象