1.继承:
B继承A的条件:
逻辑上B是A的"一种(a kind of)",且A的所有属性和功能对B都有意义,则容许继承.
比如CSaleman(销售人员)类继承CCompanyStaff(员工)类,
轿车可以继承交通工具的所有特征.因为轿车是一种交通工具.
2.聚合.
A聚合B的条件:
逻辑上B是A的"一部分(a part of)",A需要使用B的功能,而A和B又不属于同一类的范畴,
比如CCompanyStaff(员工)类聚合CEducation(学历)类,Line(线段)类聚合Point(点)类.
轿车类内嵌发动机的对象,两者不能继承,不属于一类,只能聚合,让轿车使用发动机的功能.
一:继承:
第一:继承的概念:
子类可以继承父类除了构造函数,析构函数之外的所有成员,但是能否使用要受继承方式的限制.
第二:继承的类别:
1.公有继承:
class A : public B
{
}
父类的公有成员和保护成员被继承时保持不变.
父类的私有成员被继承,但是在子类中不可见.
2.私有继承:
class A : private B
{
}
或者
class A : B
{
}
父类的公有成员和保护成员均被继承为私有的.
父类的私有成员虽被继承,但是在子类中不可见.
3.保护继承:
class A : protected B
{
}
父类的公有成员和保护成员均被继承为保护的.
父类的私有成员虽被继承,但是在子类中不可见.
总结:
(1).无论哪一种继承方式,父类的私有成员只能通过本类的成员函数访问,类外(包括子类中)均不可访问.
(2).保护成员存在的必要性:设计类时考虑其可能被继承,为了使子类能够访问父类的隐藏成员而设立的.
保护成员和私有成员对于本类来说均可以实现隐藏成员的功能,本类之外均不可访问,只是保护成员为子类使用其提供了可能.
二:C++中类的聚合:
1.在一个类中内嵌其他类的对象作为成员.
聚合类:内嵌其他类的对象作为成员的类.
聚合类的"内嵌对象"("子对象").
2.聚合类与聚合类的内嵌对象之间的关系是:
整体与部件的关系,两者往往不属于同一类范畴.
也是拥有和被拥有的关系.前者可以使用后者的功能.
3."聚合"隐含两种实现方式:
1)."包含"关系:例如线段可由两个点组成,是独立的定义,两者具有不同的生命周期
2)."嵌套"关系:整体对象的一个属性就是部分对象,唯一属于关系,具有相同的生命周期
4.聚合类的构造函数:
一个类既是派生类又是聚合类,其对象创建时系统先调用基类的构造函数,然后调用内嵌对象的
的构造函数,最后才是本类的构造函数.而对象消亡时,析构函数的调用顺序相反.
使用构造函数初始化列表来完成其对象的创建.
类名::类名(形参表) : 基类名(形参表),内嵌对象名(形参表){}
示例代码:
#include"stdafx.h"
#include <iostream>
using namespace std;
//Point类:点类的定义
class Point
{
private:
int x;
int y;
public:
Point(int a = 0,int b = 0)
{
x = a;
y = b;
}
void Display()
{
cout<<"点的坐标是:"<<x<<","<<y<<endl;
}
};
class Cow
{
public:
char m_Color[20];
int m_Width;
Cow() { }
Cow(char Color[],int Width)
{
strcpy(m_Color,Color);
m_Width = Width;
}
};
//Line类的定义
class Line
{
public:
//类Line的成员属性a,b为类Point的对象
Point a,b;
Cow cw;
Line() { }
Line(char color[],int width,Point & a1,Point & b1) : cw(color,width)
{
a = a1;
b = b1;
}
Line(Line & s)
{
a = s.a;
b = s.b;
cw = s.cw;
}
//显示成员属性的函数
void Display()
{
a.Display();
b.Display();
cout<<"Color="<<cw.m_Color<<" Width="<<cw.m_Width<<endl;
}
};
void main(int argc, char* argv[])
{
Point a;
Point b(7.8,9.8);
a = b;
Line s("黄色",4,a,b);
s.Display();
system("pause");
}