C++ 中容器和继承的差异
容器: 当一个类对象在另一个类中被创建时,该对象将成为那个类的成员,这种类之间的关系被称为 容器关系 或 拥有 关系,因为一个类包含了另一个类的对象。
在这种关系中,包含另一个类中的对象和成员的类被称为 容器类 ,而作为另一个对象一部分的对象被称为 被包含对象 ,而包含另一个对象作为其部分或属性的对象被称为 容器对象 。
容器语法:
// 被包含的类
class first {
// 类定义
};
// 容器类
class second {
// 创建first对象
first f;
.
.
};
程序1:
下面的程序解释了C++中容器的概念:
// C++ 程序说明容器的概念
#include <iostream>
using namespace std;
class first {
public:
void showf()
{
cout << "Hello from first class\n";
}
};
// 容器类
class second {
// 创建first类对象
first f;
public:
// 定义构造函数
second()
{
// 调用first类的函数
f.showf();
}
};
// 主程序
int main()
{
// 创建second类对象
second s;
}
Hello from first class
解释: 在上面的第二个类中,有一个first
类的对象。这种继承关系被称为具有has_a
关系,因为类second
拥有类first
的对象作为其成员。从对象f
中调用了first
类的函数。
继承: 它是一种类能够从另一个类中继承属性和特性的能力,这被称为 基类 。它是面向对象编程中最重要的特性之一。从另一个类中继承属性的类称为 子类 或 派生类 ,而其属性被另一个类继承的类被称为 基类 或 超类 。
语法:
class 子类名: 访问模式 基类名 {
// 子类代码
};
解释:子类名
是子类的名称,访问模式
是一种想要继承此子类的模式,例如public
,private
等。基类名
是要从中继承子类的基类名称。
注意: 派生类不会继承私有数据成员的访问权限。但是,它确实继承完整的父对象,其中包含该类声明的任何私有成员。
程序2:
下面的程序解释了C++的继承:
// C++程序说明继承
#include <iostream>
using namespace std;
// 基类
class Shape {
public:
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
// 派生类
class Rectangle: public Shape {
public:
int getArea() {
return (width * height);
}
};
// 主程序
int main(void) {
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// 输出对象的面积
cout << "Total area: " << Rect.getArea() << endl;
return 0;
}
Total area: 35
解释: 在上面的程序中,基类是Shape
,该类具有设置宽度和高度的功能。在Rectangle
类中,使用public
模式从基类继承属性和功能,并使用该类的getArea()
函数计算面积。
// C++程序演示继承的概念
#include <bits/stdc++.h>
using namespace std;
// 基类
class Parent {
public:
int id_p;
};
// 子类继承自基类(Parent)
class Child : public Parent {
public:
int id_c;
};
// 主函数
int main()
{
Child obj1;
// 子类对象具有父类的所有数据成员和成员函数
obj1.id_c = 7;
obj1.id_p = 91;
cout << "Child ID is "
<< obj1.id_c << endl;
cout << "Parent ID is "
<< obj1.id_p << endl;
return 0;
}
Child ID is 7
Parent ID is 91
解释: 在上面的程序中, 子类 是从 父类 继承而来的,因此子类也继承了父类的公共数据成员。
继承和组合的区别:
继承 | 组合 |
---|---|
它使一个类从基类继承数据和函数 | 它使一个类将不同类的对象作为其数据成员包含其中。 |
派生类可以覆盖基类的功能。 | 容器类不能覆盖包含类的功能。 |
派生类可以向基类添加数据或函数。 | 容器类不能向包含类添加任何东西。 |
继承表示一种 “是一个” 关系。 | 组合表示一种 “有一个” 关系。 |