条款39:明智而审慎的使用private继承

本文探讨了C++中私有继承的特点及其应用场景。私有继承打破了传统的is-a关系,转而强调has-a关系,即根据某物实现。此外,文章还介绍了私有继承在访问基类受保护成员及实现空基类优化方面的优势。

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

先说private继承的特点:1.也就是说,编译器不会讲一个private继承而来的派生类对象转化为一个基类对象。这意味着,priavte继承不再是is-a关系:

class Person
{
protected:
	string name;
};

class Student:private Person
{
private:
	string schoolNumber;
};

void eat(const Person& p)
{
	cout<<"eat"<<endl;
}

void study(const Student& s)
{
	cout<<"study"<<endl;
}

int main()
{
	Person p1;
	eat(p1);
	Student s1;
	study(s1);
//	eat(s1);错误
	return 0;
}
2.基类的public和protected成员在派生类中全为private属性。


因此,private继承意味着:根据某物实现。这与前面条款介绍的复合很类似。在大多数时候,我们应该使用复合,而不是private继承来实现这种功能。但是当有protected成员和虚函数牵扯进来的时候,我们又不得不用private继承。

其次,与复合相比,private可以使空基类的最优化。先看一个例子:

//定义一个空基类
class Empty{};

class HoldsAnInt
{
private:
	int x;
	Empty e;//复合
};

在vs2010中,sizeof(int)为4,sizeof(Empty)为1,sizeof(HoldsAnInt)为8这似乎有悖于我们学过常理:首先,类的大小取决于其数据成员的大小。sizeof(Empty)应该为0,但是由于在编译器会将它的大小设为1,而“齐位需求”会将它放大为1个int,所以,izeof(HoldsAnInt)为8。但是,如果使用的是private继承来实现,就不存在这种问题了:sizeof(HoldsAnInt)只有一个int的大小:4.


总之,private继承意味着根据某物实现。当派生类需要访问基类的的受保护成员或者重新定义虚函数时,我们才使用它。而且private继承可以是得空基类最优化,如果在开发中需要是得对象尺寸最小,那么也用得着它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值