C++特性之继承分析

三种继承类型

C++继承分为,公有继承、保护继承、私有继承,下面通过例子来分析下三种继承各自的特性。
首先我们先定义一个基类,此基类包含有三种成员,分别为公有成员,保护成员,私有成员。

class Parent
{
public:
	void printPublic() { cout << "printPublic" << endl; }
protected:
	void printProtected() { cout << "printProtected" << endl; }
private:
	void printPrivate() { cout << "printPrivate" << endl; }
};

公有继承

下面我们定义一个子类,这个类通过公有继承实现。

class ChildPublic : public Parent
{
	void Print()
	{
		printPublic();
		printProtected();
//		printPrivate();		// 此成员在基类是私有的,所以子类中无法调用
	}
};

我们可以看到基类的公有成员和保护成员可以在子类的内部访问,但是私有成员在子类内部是无法访问的。再来看下公有继承下子类对象对于基类中成员的访问情况。

	ChildPublic ch1;
	ch1.printPublic();
//	ch1.printProtected();	// 保护成员,不能访问
//	ch1.printPrivate();		// 私有成员,不能访问

很显然,因为公有继承不改变类成员的成员属性,所以公有成员可通过子类的对象,保护成员和私有成员不能通过子类的对象访问。

保护继承

class ChildProtected : protected Parent
{
	void Print()
	{
		printPublic();
		printProtected();
//		printPrivate();		// 此成员在基类是私有的,所以子类中无法调用
	}
};

我们可以看到基类的公有成员和保护成员可以在子类的内部访问,但是私有成员在子类内部是无法访问的。和公有继承有相同的属性。再来看下保护继承下子类对象对于基类中成员的访问情况。

	ChildProtected ch1;
//	ch1.printPublic();		// 保护成员,不能访问
//	ch1.printProtected();	// 保护成员,不能访问
//	ch1.printPrivate();		// 私有成员,不能访问

可以看到,基类中的公有成员通过保护继承后,子类对象不能访问基类的公有成员了,因为通过保护继承规则,基类的公有成员的成员属性变成了保护属性了,基类原有的保护成员和私有成员通过保护继承则保持原来的成员属性不变。

私有继承

class ChildPrivate : private Parent
{
	void Print()
	{
		printPublic();
		printProtected();
//		printPrivate();		// 此成员在基类是私有的,所以子类中无法调用
	}
};

我们可以看到基类的公有成员和保护成员可以在子类的内部访问,但是私有成员在子类内部是无法访问的。和公有继承有相同的属性。再来看下私有继承下子类对象对于基类中成员的访问情况。

	ChildPrivate ch1;
	ch1.printPublic();		// 私有成员,不能访问
	ch1.printProtected();	// 私有成员,不能访问
	ch1.printPrivate();		// 私有成员,不能访问

可以看到,基类中的公有成员通过私有继承后,子类对象不能访问基类的私有成员了,因为通过私有继承规则,基类的公有成员和保护成员的成员属性变成了私有属性了,基类私有成员通过私有继承则保持原来的成员属性不变。

总结:
三种继承均有以下四个结论:
1、基类的公有成员可以在子类内部访问
2、基类的保护成员可以在子类内部访问
3、基类的私有成员不能在子类内部访问
4、基类成员能否通过子类对象访问,则要根据基类的成员通过三种继承后在子类中所表现出的成员属性,依照C++类成员可访问性的基本规则。

私有继承的作用

多继承

菱形多继承

二义性

二义性消除

非菱形多继承

会产生何种缺陷

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值