文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

浅谈C++不同继承之间的关系

2023-05-16 14:14

关注

公有继承:“是一个” 的关系

派生类与基类:

赋值兼容规则

C++面向对象编程中一条重要的规则是:公有继承意味着 “是一个” 。一定要牢牢记住这条规则。在任何需要基类对象的地方都可以用公有派生类的对象来代替,这条规则称赋值兼容规则。它包括

以下情况:

如下代码示例:

class Object
{
public:
int value;
public:
Object(int x = 0) :value(x) {}
~Object() {}
void print(int x)
{
value = x;
cout << value << endl;
}
};
class Base : public Object
{
public:
int num;
public:
Base(int x = 0):Object(x),num(x+10) {}
};
int main()
{
Base base(10);
Object obja(0);
Object *op = &base;
Object &ob = base;
obja = base;
return 0;
}

继承关系中的构造函数与析构函数

class Person
{
	int _id;
public:
	Person(int id) :_id(id)
	{
		cout << "Create Person " << this << endl;
	}
	~Person()
	{
		cout << "Destroy Person " << this << endl;
	}
};
 
class Student : public Person
{
	int _s_id;
 
public:
	Student(int id, int s, int n) :_s_id(s),  Person(id)
	{
		cout << "Create Student: " << this << endl;
	}
	~Student()
	{
		cout << "Destroy Student" << this << endl;
	}
};
int main()
{
	Student stud(90010, 202201, 23);
	return 0;
}

定义基类person,派生类student,当在主函数中创建一个派生类对象时,首先创建person对象,再创建student对象,析构时,先析构派生类对象,再析构基类对象

继承关系中拷贝构造函数

继承关系中赋值运算符的重载

通过组合体现 “有一个” 或 “用…来实现”

使某个类的对象成为另一个类的数据成员,从而实现将一个类构筑在另一个类之上,这一过程称为

"组合“,分层;

组合

通过组合来体现 “有一个” 或 “用…来实现”。
例如,“汽车有一个发动机 或 汽车用发动机来实现 ” (has-a) 关系可以用单一组合表示为:

class Engine // 发动机
{
private:
int cylinderNum; // 气缸数
public:
Engine(int n = 4) :cylinderNum(n) {}
void Start(); // 启动
};
class Car
{
private:
Engine eg;
public:
Car():eg(8) {}
void StartCar();
};

**组合关系:**通过组合体现 “有一个” 或 “用…来实现”。组合是一种耦合度更强的关联关系。存在组合关系的类表示“整体-部分”的关联关系,“整体”负责“部分”的生命周期,他们之间是共生共死的;并且“部分”单独存在时没有任何意义。

同样的“有一个”关系也能用私有继承表示:

class Engine // 发动机
{
private:
int cylinderNum; // 气缸数
public:
Engine(int n = 4) :cylinderNum(n) {}
void EnStart(); // 启动
};
class Door
{
private:
int doorNum;
public:
Door(int n = 5) :doorNum(n) {}
}
class Car : private Engine
{
public:
Car() :Engine(8) {}
void StartCar(); //通过发动引擎来发动这辆汽车
};

私有继承: 要表示类之间 “用…来实现” 的关系,可以选择是通过私有继承实现。现在这种情况下,这一技术就比分层更有优势,因为通过它可以让你告诉别人:Engine使用起来不安全,它只能用来实现其它的类

**聚合关系:**通过聚合体现 “有一个” 或 “用…来实现”。 整体类与局部类之间松耦合,相互独立。

class Engine // 发动机
{
private:
int cylinderNum; // 气缸数
public:
Engine(int n = 4) :cylinderNum(n) {}
void Start(); // 启动
};
class Car
{
private:
Engine *peg;
public:
Car():peg(nullptr) {}
void SetEngine(Engine *p) { peg = p;}
void StartCar();
};

总结

公有继承与组合的区别

继承与组合都是面向对象中代码复用的方式。

公有继承: 父类的内部细节对子类可见,其代码属于白盒式的复用;
例如: class Person ; class Student;

公有继承的优缺点

优点:

缺点:

组合和私有继承

**组合:**意味着 “用…来实现”; 对象之间的内部细节不可见,其代码属于黑盒式复用。
私有继承意味着 “用…来实现”; 是组合关系,父类的内部细节对子类不可见,其代码属于黑盒式复用。

优点:

缺点:

公有继承与私有继承和组合如何选择?

在对象分析时明确具有是一个(is - a) 的关系,使用公有继承。
在对象分析时明确具有 “有一个” 或 "用…来实现"关系,使用组合和私有继承。

私有继承和组合如何选择?

答案很简单:尽可能地使用组合,必须时才使用私有继承。什么时候必须呢?这往往是指有保护成员
和/或虚函数介入的时候考虑考虑使用私有继承。
//私有继承在编码过程中就要指定具体的父类,其关系在编译期就确定,而组合的关系一般在运行时确定。

到此这篇关于浅谈C++不同继承之间的关系的文章就介绍到这了,更多相关C++继承关系内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯