我们可以将一个类的对象创建为另一个类,而该对象将成为该类的成员。类之间的这种类型的关系称为Containership或has_a关系,因为一个类包含另一个类的对象。包含这种关系的另一个类的对象和成员的类称为容器类。
属于另一个对象的对象称为包含对象,而包含另一个对象作为其部分或属性的对象称为容器对象。
集装箱运输与继承之间的区别
货柜船
->当需要在新类中使用现有类的功能而不是其接口时
对于例如->
1)计算机系统有硬盘
2)汽车有发动机,底盘,方向盘。
遗产
->当您要强制新类型与基类相同时。
对于例如->
1)计算机系统是一种电子设备
2)汽车是车辆
如上所示,员工的类型可以不同。它可以是开发人员,人力资源经理,销售主管等。他们每个人都属于不同的问题领域,但员工的基本特征是所有人共有的。
集装箱运输的语法:
// Class that is to be contained
class first {
.
.
};
// Container class
class second {
// creating object of first
first f;
.
.
};
下面的示例以更好的方式解释了C++中的Containership。
范例1:
// CPP program to illustrate
// concept of Containership
#include
using namespace std;
class first {
public:
void showf()
{
cout << "Hello from first class\n";
}
};
// Container class
class second {
// creating object of first
first f;
public:
// constructor
second()
{
// calling function of first class
f.showf();
}
};
int main()
{
// creating object of second
second s;
}
Hello from first class
说明:在第二类中,我们有一个第一类的对象。这是我们目睹的另一种继承。如我们说第二类第一具有第一类的一个对象作为其成员这种类型的继承被称为has_a关系。从对象f,我们首先调用类的函数。
范例2:
#include
using namespace std;
class first {
public:
first()
{
cout << "Hello from first class\n";
}
};
// Container class
class second {
// creating object of first
first f;
public:
// constructor
second()
{
cout << "Hello from second class\n";
}
};
int main()
{
// creating object of second
second s;
}
Hello from first class
Hello from second class
说明:在此程序中,我们没有将class first继承为class class second,而是因为我们拥有class first的对象作为second class的成员。因此,当第二类的默认构造函数被调用时,由于在第二个第一类的对象的F存在,类的默认的构造第一首先被调用,然后类的第二默认构造函数被调用。
范例3:
#include
using namespace std;
class first {
private:
int num;
public:
void showf()
{
cout << "Hello from first class\n";
cout << "num = " << num << endl;
}
int& getnum()
{
return num;
}
};
// Container class
class second {
// creating object of first
first f;
public:
// constructor
second()
{
f.getnum() = 20;
f.showf();
}
};
int main()
{
// creating object of second
second s;
}
Hello from first class
num = 20
说明:在集装箱运输的帮助下,我们只能使用该类的public成员/函数,而不能使用protected或private 。在第一堂课中,我们借助getnum返回了引用。然后我们通过调用showf来显示它。
例子4
#include
using namespace std;
class cDate
{
int mDay,mMonth,mYear;
public:
cDate()
{
mDay = 10;
mMonth = 11;
mYear = 1999;
}
cDate(int d,int m ,int y)
{
mDay = d;
mMonth = m;
mYear = y;
}
void display()
{
cout << "day" << mDay << endl;
cout <<"Month" << mMonth << endl;
cout << "Year" << mYear << endl;
}
};
// Container class
class cEmployee
{
protected:
int mId;
int mBasicSal;
// Contained Object
cDate mBdate;
public:
cEmployee()
{
mId = 1;
mBasicSal = 10000;
mBdate = cDate();
}
cEmployee(int, int, int, int, int);
void display();
};
cEmployee :: cEmployee(int i, int sal, int d, int m, int y)
{
mId = i;
mBasicSal = sal;
mBdate = cDate(d,m,y);
}
void cEmployee::display()
{
cout << "Id : " << mId << endl;
cout << "Salary :" <
output
Id : 1
Salary :10000
day 10
Month 11
Year 1999
Id : 2
Salary :20000
day 11
Month 11
Year 1999