C++那.事,继承、多重继承、调用父类带参构造函数。

本文深入探讨C++中的继承概念,包括公有继承、保护继承和私有继承的特性。公有继承保持成员权限不变,允许外部访问;保护继承仅限类内部访问;私有继承则对外不可见。同时,文章讲解了如何在子类中调用父类的带参构造函数,以及在多重继承中可能遇到的二义性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、继承

随便定义一个类

class people
{
	private :
	int i;
	protected:
	int j;
	public:
	int k;
	public :
	people()
	{
		i = 1;
		j = 2;
		k = 3;
	}	
	public :
	void display()
	{
		cout<<i<<endl;	
	}
} ;

公有继承

公有继承的类,父类中的成员和函数在子类中不改变权限,原来为public仍然为public,可以在类外部(对象)访问,protected也没有改变仍然只能在类内部,而private虽然还是为private类型,在使用时可以理解为无法继承,无法使用(但确实是继承了),因为父类中的被private修饰的成员无法在其他类中被访问(友元类除外)。

class student:public people
{
	public :
	 	student(){
		 }
	void coutpro()
	{
		/*i = i + 20;cout<<i<<endl;编译器报错*/ 
		j = j + 10;
		cout<<j<<endl;	
	}	 
};
int main()
{   
	student stu;
	cout<<stu.k<<endl;/*cout<<stu.j;编译器报错*/
	stu.coutpro();	
	people p;
	p.display();/*一个类的private成员只能通过本身的内部访问*/ 
	return 0;
}

保护继承

private成员仍然不能被访问,其他类型成员在子类中全部为protected,只能通过内部访问,可以将整个类封装起来,这个子类的全部成员外部是无法访问的,只有在实例化时,类本身对其成员进行操作。保护了类中所有的成员,避免其他代码无意有意更改。
class student:protected people
{
	public :
	 	student(){
		 }
	void coutpro()
	{
		k = k + 20; 
		j = j + 10;
		cout<<j<<endl<<k<<endl;	
	}	 
};
int main()
{   
	student stu;
	/*cout<<stu.k<<endl;编译器报错*/
	stu.coutpro();	
	return 0;
}

私有继承

子类私有继承父类,父类的private仍然不可以被访问,父类中其他成员在子类中均为private只有子类可以进行内部访问。这点和保护继承相同,区别是:子类私有继承了父类之后,其所有成员全是private型,这个子类的子类无论以什么方式继承都无法访问任何一个变量。而保护继承的子类,其中的成员为protected,只要有类再次保护继承,就可以实现一串外部不可见、自己维护成员、连续继承的类。

多重继承

一个类可以继承多个类,继承方式也可以不相同。

调用父类的带参构造函数

一个类可以继承多个类。在实例化时,构造函数的调用顺序,依然是父类-->子类,当有多个父类时,按参数列表继承,也就是在继承运算符:之后先写的哪个类就先调用哪个类的构造函数。
默认情况优先调用父类的无参构造函数,无论父类里是否存在带参构造函数、子类构造函数是否有参数。
想要调用父类的带参构造函数需子类显示调用。
#include<iostream>
using namespace std;
class Binary 
{
	protected :
	int B_value;
	public :
	Binary(int i){
		if(i >= 1)
		{
			B_value = 1;
		}
		else
		{
			B_value - 0;
		}
		cout<<"Binary:"<<endl; 
	}
};
class Number
{
	protected :
	int N_value;
	public :
	Number(int i){
		N_value = i;
		cout<<"Number:"<<endl;
	}	
};
class one : protected Binary,public Number
{
	public :
		one(int i):Binary(i),Number(i)
		{
			
		}
	public :
	void display()
	{
		cout<<"B:"<<B_value<<endl<<"N:"<<N_value<<endl;	
	}	
};
int main()
{   
	one o(10);
	o.display();
	return 0;
}
上述代码实例化一个one类,它既属于二进制数,也属于数字类,在实例化时显示调用父类带参函数。继承方式:保护继承二进制数,外部无法更改这个B_value量,而数字类的N_value可以被外部更改。

二义性

多重继承时父类不要出现同名成员,不然系统无法确定在调用时具体调用哪个类里面的成员。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值