面向对象思维是编程中很重要的一个思维,众所周知面向对象编程有三大特性封装、继承、多态,今天我就来分享一下三大特性之一的继承。
一、什么是继承?
我们举例说明,比如你老爸的财产你可以使用,这就是继承,在面向对象中,体现为一个子类可以使用父类的成员属性和成员函数,自己不用在类内实现就可以使用。但是你只能用你老爸允许你使用的财产,比如车,你老爸不允许你使用的财产,你是无法使用的,在面向对象中体现为父类的公有成员子类是可以继承使用的,但是父类的私有成员子类不可以继承使用,还有一个继承方式体现为你继承你老爸的财产之后你想不想让别人访问这些财产。
二、继承可以干什么?
继承可以省去很多的重复代码,减少工作量,程序的逻辑性也会更强,可读性也大大提高,而且会方便后期的运维。
三、继承的三种方式
1、public方式继承
创建一个父类Base1里面分别创建三种类型(public、protect、private)的成员属性,创建一个类Son1让它继承Base1以public方式,语法为class 子类类名 :继承方式 父类类名,可以看到我们Son1类内没有创建m_A和m_B属性但是我们可以直接在子类func函数中进行赋值不会报错这就是继承。(仔细看下面代码段的注释)
class Base1
{
public:
int m_A;
protected:
int m_B;
private:
int m_C;
};
class Son1 :public Base1
{
public:
void func()
{
m_A = 100;//父类的public成员,通过Public继承,在子类中也是public属性
m_B = 100;//父类的protected成员,通过Public继承,在子类中是protected属性
//m_C = 100;//父类的私有成员,子类无法访问
}
};
我们创建一个test01函数输出m_A和m_B,可以看到关于m_B的代码会报错,说明其不可类外访问验证了上面代码段的注释内容,而m_B可以正常输出。
void test01()
{
Son1 s1;
s1.m_A = 1000;
cout << "s1.m_A="<<s1.m_A << endl;
//s1.m_B = 1000;父类的protected成员,通过Public继承,在子类中是protected属性,类外不可访问
//cout << "s1.m_B="<<s1.m_B << endl;
}
结果如下
2、protect继承
同样我们创建一个父类Base2里面分别创建三种类型(public、protect、private)的成员属性,创建一个类Son2让它继承Base2以protect方式,语法依然为为class 子类类名 :继承方式 父类类名。(仔细看下面代码段的注释)
class Base2
{
public:
int m_A;
protected:
int m_B;
private:
int m_C;
};
class Son2 :protected Base2
{
public:
void func()
{
m_A = 100;//父类的public成员,通过protected继承,在子类中变为protected属性
m_B = 100;//父类的protected成员,通过protected继承,在子类中变为protected属性
//m_C = 100;//父类的私有成员,子类无法访问
}
};
同样创建一个test02函数访问m_A和m_B,都出现了报错,所以我们进行了注释并解释了原因见下面代码注释。
void test02()
{
Son2 s2;
//s2.m_A = 1000;//父类的public成员,通过protected继承,在子类中变为protected属性,类外不可访问
//s2.m_B = 1000;父类的protected成员,通过protected继承,在子类中是protected属性,类外不可访问
}
3、private继承
再次创建一个父类Base3里面分别创建三种类型(public、protect、private)的成员属性,创建一个类Son3让它继承Base3以private方式,
class Base3
{
public:
int m_A;
protected:
int m_B;
private:
int m_C;
};
class Son3 :private Base3
{
public:
void func()
{
m_A = 100;//父类的public成员,通过private继承,在子类中也是private属性
m_B = 100;//父类的protected成员,通过private继承,在子类中也是private属性
//m_C = 100;//父类的私有成员,子类无法访问
}
};
并创建test03来访问m_A和m_B,发现不可访问原因见下面代码注释。
void test03()
{
Son3 s3;
//s3.m_A = 1000;//父类的public成员,通过private继承,在子类中也是private属性,类外不可访问
//s3.m_B = 1000;//父类的protected成员,通过private继承,在子类中也是private属性,类外不可访问
}
四、总结
继承有三种方式public、protect、private他们继承后成员属性变化为
public
父类的public成员,通过Public继承,在子类中也是public属性,类外可访问
父类的protected成员,通过Public继承,在子类中是protected属性,类外不可访问
protect
父类的public成员,通过protected继承,在子类中变为protected属性,类外不可访问
父类的protected成员,通过protected继承,在子类中变为protected属性,类外不可访问
private
父类的public成员,通过private继承,在子类中也是private属性,类外不可访问
父类的protected成员,通过private继承,在子类中也是private属性,类外不可访问
另外父类的private成员不可被继承。