类的总结这一段时间的学习,对类的理解有了一些更深的了解,这一段时间学习到了组合和继承,虚函数和多态。 首先是组合和继承,组合在使用时比较简单,就是将一些基本的类作为一些类的成员,从而运用这些类的功能。
代码语言:javascript复制 例:class number
{
};
class all
{
number l;
};
这就是最基本的组合方式。继承类似组合的作用,组合是将其他的类作为成员放入类中,而继承则是直接将基类的成员直接继承到派生类中。
代码语言:javascript复制`例如:class base
{
int a;
};
class second:public base
{
};
`这样
base中所有的成员就被集成到second中,包括私有,保护和公有,但是私有的成员不能够被直接使用,有参的构造函数和析构函数,派生类的构造函数与析构函数也必须有参,对派生类的上一层基类中的析构与构造进行定义,
代码语言:javascript复制 `例如:class base
{int l;
public:
base(int a):l(a) \\基类的构造函数
{
}
}
;class second:public base
{
second(int a):base(a) \派生类的构造函数
{}
};`
而且构造函数先后顺序为基类,对象成员,派生类,调用析构函数的顺序为派生类,对象成员,基类。这样second中也存在a这个成员但是second不能对a进行操作,因为a是私有成员,只能通过共有函数进行对a的操作,也可以将a设置为protected类型,这样second就可以直接对a进行操作。所以若是基类中的数据希望被派生类操作,最好是将数据成员设为protected。
代码语言:javascript复制`例:
class base
{protected:int a;
};
class second:public base
{
};`
派生类中有基类中所有的成员,并且本身的成员也保留,但也存在基类中的函数并不能实现想要的功能,这时候就可以采用覆盖的方式来修改函数的内容,即在派生类中定义的函数的定义方式与基类相同的情况,则派生类中这个函数的内容是派生类中的内容,若是再使用基类中的函数,则可以采用基类::函数名的方式
代码语言:javascript复制 例:class base{
public:void print()
{
cout<<”1”;
}
};
class new{
void print() \对基类中函数进行覆盖
{cout<<”2”;
base::print(); \重新调用在派生类中被覆盖的基类中的成员函数
}
};
继承之后产生的派生类是可以再加入新成员的。其次是虚函数,虚函数其中一个作用便是可以实现多态,在基类中定义一个虚函数格式为:
代码语言:javascript复制 virtual 返回类型 函数名();
这样有这个基类产生的派生类中可以对virtual后的函数进行定义,但定义时要和基类中定义函数的方式相同(包括返回值,函数名,参数数量,参数类型和顺序),否则没办法达到预期的效果,也可以不进行定义,但定义时要注意如果只是参数不同,就和一般的重载函数一样,但若是返回值类型不同就会报错。
虚函数定义完成之后,继承之后产生的派生类的此函数就是派生中的函数,由于这个特性,很多时候在基类中对虚函数的内容可能就显得有些多余,然后我们就可以使用纯虚函数,这样在派生类在对纯虚函数进行定义,作用就可以和虚函数一样。拥有纯虚函数的类就被称为抽象类。纯虚函数的优点是可以先不用定义函数的功能,而是由派生类进行定义即可,另外要注意析构函数可以做虚函数,但是构造函数不可以。
定义方式:virtual 返回类型 函数名()=0;
虚函数可以实现多态,最简单的一个应用则是将派生类引用或传址给基类,这样基类中的虚函数会根据派生类中的对应函数定义来确定函数的功能,主要采用的是传址和引用两个方式,但引用之后的基类只保留基类原有的函数和对应虚函数。
例:
`1:base *p;
second l; p=&l;
2:
second l;
base &p=l;
但只能通过基类指针的方式才能实现多态,即第一种方式。通过这种方式就可以在使用不同的类时,让每一个类都拥有自己独特需要的功能函数,不需要再在派生类中对想要的函数功能进行重新定义` ,