C++ 继承关系及其深层含义

本文详细探讨了C++中的继承关系,包括public继承体现的is-a关系,接口继承与实现继承的区别,通过复合实现has-a关系,以及明智使用private继承的情况。强调了在设计时要考虑继承的意图,如public继承表示的是is-a,private继承则意味着is-implemented-in-terms-of。同时,文章还提到了复合在某些情况下优于private继承。

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

1、概述

C++ 中的继承可以是单一继承或者多重继承,每一个继承连接可以是 public,protect 或 private,也可以是 virtual 或 non-virtual。但是这些继承方面的关系是怎么的?选择使用哪一种继承时的标准是什么?我们总是给忽略掉,前面我们整理了一部分 virtual 和 non-virtual 继承注意事项 ,今天在整理另一部分。

2、确定 public 继承是 is-a 关系

C++ 面向对象的编程中,最重要的一个规则是:公开继承意味着 “is-a” (是一种)的关系

如果你令 class D 以 public 形式继承 class B,你便是告诉 C++编译器,每一个类型为 D 的对象同时也是一个类型为 B 的对象,反之不成立。比如:每个学生都是人,但并非每个人都是学生。

class Person { ...... };
class Student : public Person { ...... };

public 继承和 is-a 之间的等价关系听起来颇为简单,但有时候你的直觉会误导你。比如:鸟可以飞,企鹅是一种鸟。

class Bird
{
public:
	virtual void fly();		//鸟可以飞
};

class Penguin : public Bird	//企鹅是一种鸟
{
	...
};

这个例子中,我们考虑不严谨造成了这个错误,并不是说所有的鸟都会飞,而是一般的鸟都有飞行能力。以下的继承关系,能更好的表现出真实性:

class Bird
{
	...
};

class FlyingBird : public Bird
{
public:
	virtual void fly();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值