C++之继承关系(易懂篇)

本文深入解析C++中的继承关系,包括公有、私有和保护继承的特点与访问权限。通过实例展示不同继承类型下,派生类如何访问基类的成员函数与变量。

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

C++之继承关系(易懂篇)

继承概述:
C++提供了类继承的方法来扩展和修改类,该方法可以从已有的类中派生出新的类,而派生类继承了原有类的特征(包括方法)。派生类和基类之间的特殊关系是基类C++继承的底层模型。C++有三种继承关系:公有继承;私有继承,和保护继承等。
继承关系是is-a的关系,包括基类(父类)与派生类(子类)的关系,
继承关系可访问的类关系表示如下表格:

公有继承关系,可访问基类的公有成员和保护成员,不能访问私有成员,举例如下:

class father {
public:
	void FathPrints() {
		printf("访问父类1\n");
	}
	int a;
	int b;
private:
	int c;
protected:
	void printsP() {
		printf("访问父类2\n");
	}
};
class child :public father {
public:
	void ChildPrints() {
		printf("子类输出1\n");
		printsP();//子类能访问父类的protected成员变量和函数
	}
	//int a;
private:	
	int b;
};
    int main()
    {
    	child c;
    	c.FathPrints();//共有继承,可访问父类
    	c.ChildPrints();
    	//c.printsP();//不能访问
    	system("pause");
    	return 0;
    }

输出结果如下:

保护继承关系,可访问基类的公有成员和保护成员,不能访问私有成员,举例如下:

class father {
public:
	void FathPrints() {
		printf("访问父类1\n");
	}
	int a;
	int b;
private:
void printsPr() {
		printf("访问父类3\n");
	}
protected:
	void printsP() {
		printf("访问父类2\n");
	}
};
class child :protected father {
public:
	void ChildPrints() {
		printf("子类输出1\n");
		FathPrints();//子类能访问父类的protected成员变量和函数
		printsP();//子类能访问父类的protected成员变量和函数
		//printsPr();//不能访问父类private成员变量和函数
	}
	//int a;
private:	
	int b;
};
int main()
{
	child c;
	//c.FathPrints();//不可访问父类
	c.ChildPrints();
	//c.printsP();//不能访问
	system("pause");
	return 0;
}

输出结果:
在这里插入图片描述
当基类和派生类中,定义相同的成员函数及变量时,其访问方式如下面代码所示;

class father {
public:
	void prints() {
		printf("fa=%d,fb=%d\n", a, b);
	}
	int a;
	int b;
private:	
	int c;
protected:
	void printsP() {
		printf("f3=%d\n", b);
	}
	int f;

};
class child :public father {
public:
	void prints() {
		f = 10;//子类能访问父类的protected成员变量和函数
		printf("ca=%d,f=%d\n", a,f);
		printsP();//子类能访问父类的protected成员变量和函数
	}
	int a;
private:	
	int b;
};
class other_ {
public:
	father fath;
	void oprints() {
		printf("oa=%d,ob=%d",oa,ob);
		fath.prints();//可访问父类
	}
public:
	int oa;
	int ob;
};
int main()
{
	child c;
	c.father::a = 1;//父类访问方法
	c.father::b = 2;
	c.father::prints();
	c.a = 3;//子类的成员变量,自动覆盖父类成员变量
	c.prints();
	system("pause");
	return 0;
}

思绪不清晰,继续努力

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值