c++继承-----继承方式与权限问题

继承的写法---继承和派生的区别

/*父类必须是存在的    先准备一个类*/
class 父类名
{
    
};

//子类  继承方式就是权限限定词
class 子类名:继承方式 父类名
{
	
};

继承--->所产生的子类中没有新的属性、行为--->所有东西都是父类中的

//父类   
class parent
{
    
};

//子类   
class son1:public parent
{
	
};

派生(与继承区别不大、与继承写法一样)--->派生类中有新的属性、行为产生--->与继承的区别:子类的表现(有新的属性|行为)、专业术语不同(父类|基类)

//基类
class parent
{
    
};
//派生类
class son1:public parent
{
	
    
};

三种继承方式

//公有继承
class son1:public parent
{
	public:
    protected:
};
//保护继承
class son2:protected parent
{
	public:
    protected:
};
//私有继承
class son3:private parent
{
	public:
    protected:
};

继承的实质

父类的数据和成员在子类中有一份

例子:继承下来的私有属性不能直接访问,但是可以间接通过父类的函数访问

//父类
class parent 
{
public:
	void print() 
	{
		cout << name << "\t" << money << endl;    //父类中的行为
	}
	string& getWife() //提供公有接口做访问
	{
		return wife;  //继承中的私有属性,能够被继承,但是不能访问
	}
protected:
	string name;     //父类中的属性
	int money;
private:
	string wife;     //小知识: 子类中能不能直接访问父类中私有属性的wife? 不能
};
//子类 继承父类的属性&行为
class son :public parent 
{
public:
	void printSon() 
	{                //继承父类的属性、行为--->父类的属性要通过父类构造函数初始化
		print();                      //在子类没有写行为,但是可以调用父类中的函数 
		cout << name << "\t" << money << endl;
                                      //在子类中没有写属性,但是可以打印父类的数据
		//cout << wife << endl;		  //父类中私有属性不能直接访问
		cout << getWife() << endl;	  //可以间接通过父类的函数(公有接口)访问
	}
protected:
};
int main()
 {
	    son boy;
	    boy.printSon();   
}
/*输出*/

    -858993460
    -858993460 没有写构造函数初始化父类属性,输出是乱码

继承的权限问题(类外对父类属性的权限显示)

继承方式只会增强父类属性在子类中的权限显示

                                               父类中的属性在子类中的权限

继承方式 | 子类中的权限publicprotectedprivate
public继承publicprotected不可直接访问
protected继承protected(父类的public属性增强为protected属性)protected不可直接访问
private继承privateprivate不可直接访问
  • 这个表格描述的是:父类的属性在子类中能否直接访问  ,间接都可以访问<--->直接访问,部分继承没办法直接访问

  • 无论是什么继承方式,父类中的私有属性在子类中都是不可直接访问<--->能间接通过父类函数(接口)访问(上面内容<继承的实质> 已举例说明)子类的私有属性与父类无关(子类的私有属性在子类中可以访问)

  • 保护继承|私有继承,意味着 在子类中的所有属性 最低权限为保护属性|私有属性

  • 对私有继承和私有属性的特别说明:不可访问指的是父类的私有属性不能直接访问,并不是说子类的私有属性不能直接访问

class A 
{
public:
	int a1;
protected:
	int a2;
private:
	int a3;
};

//公有继承
class B :public A 
{
/*公有继承产生子类 继承就相当于在子类中定义了3个变量,这3个变量分别是这些属性*/
public:
	//int a1;
protected:
	//int a2;
private:
	//int a3;  采用公有继承,a3能被继承,展示为私有属性,但是不能直接访问
};

//保护继承
class C :protected A
{
public:
	
protected:
	//int a1;   //public属性显示为protected属性
	//int a2;
private:
	//int a3;  采用公有继承,a3能被继承,但是不能直接访问
};

//私有继承
class D :private A
{
public:
	void print() 
	{
		cout << a1 << endl;
		cout << a2 << endl;  //继承下来的属性权限为私有,在类中自己还是可以访问的
		//cout << a3 << endl;//报错:父类的私有属性不能直接访问,其他属性可以访问
	}
protected:
	
private:
	//int a1;  //私有继承:父类中的属性在子类中的权限全部是私有属性
	//int a2;
	//int a3;   采用公有继承,a3能被继承,但是不能直接访问
};

int main()
{
    B b;
	b.a1 = 123;    //a1继承下来后,在子类中的权限是公有类型,类外是可以访问公有类型的
	C c;
	//c.a1 = 12;   //报错:父类中的a1已经在当前子类中转换为保护属性,没办法直接访问
	return 0;
}

保护属性和私有属性的区别(继承中有区别)

  • 一旦一个类被私有继承后,这个类继承下来后没有办法延续下去,"断子绝孙"

  • 私有继承会导致当前父类无法在孙子类中有任何作用

  • 想让一个类只产生一个子类,不产生子类的子类,一般用私有继承

//父类
class A 
{
public:
	int a1;
protected:
	int a2;
private:
	int a3;
};

//私有继承
class D :private A
{
public:
	void print() 
	{    
		cout << a1 << endl;
		cout << a2 << endl;
	  //cout << a3 << endl;
                          
	}
protected:
	
private:
	//int a1;  
	//int a2;
	//int a3;   
};

class F :public D     //D类产生F类
{
public:
    /*A类中的属性在D类中已经全部转换为私有的--->对于A类的属性不能再使用了,传不下来了
      A类中的所有东西在F类没有任何效果了*/
};

小知识:

为什么要知道&了解权限 ?

要知道类外对象怎么访问成员、能不能访问成员、类中能不能使用这个成员.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiuqiuyaq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值