C++ Primer Plus 13章 类继承(3)
C++ Primer Plus 13章 (3)
前面两个部分是对于继承的派生类应该做些什么,以及派生类和基类的关系做了描述。
下面是对于继承的最后一部分描述。
访问控制:Protected
我们知道继承分为3类,但是常用的都是public继承,里面一般包含来private成员和public成员,下面介绍protected成员,它和private相似,但是在派生类时有区别,如下:
(1)使用派生类的成员可以直接访问基类的保护成员,但不能直接访问基类的私有成员。
(2)对外部程序来说,保护成员的行为与私有成员相似;但对于派生类来说,保护成员的行为与公有成员相似。
抽象基类
有时候一个简单的基类并不能满足我们对于这一类物体的描述,即使在它的基础上进行派生。
我们有时候可能需要一个包含大多数物体的公有特征的基类,以此来进行派生更多的类去包含着一整个类别的物体描述。将这种基类称为抽象基类。(ABC)
书中的例子:椭圆和圆,圆是一种特殊的椭圆,虽然我们可以直接从椭圆派生,但是这种方式会显得臃肿,因为圆只有半径就可以描述,而椭圆则需要更多的参数,从这个方面来说,继承是不可取的。还不如直接定义圆。但是直接定义圆,我们又无法对其进行公共的操作,因为它是两个类。
因此,在这个基础上,定义了抽象类:
class BaseEllipse
{
private:
double x;
double y;
....
public:
BaseEllipse(double x0=0,double y0=0):x(x0),y(y0){}
virtual ~BaseEllipse(){}
void Move(int nx,int ny){x=nx;y=ny}
virtual double Area() const = 0;//这个函数是纯虚函数
}
在上面这个抽象类的定义中,C++通过使用纯虚函数提供未实现的函数。纯虚函数声明的结尾处为0。
当类声明中包含纯虚函数时,则不能创建该类的对象。即包含纯虚函数的类只用作基类。
继承和动态内存分配
第一种情况:派生类不使用new
基类中,有成员定义为指针,使用来new来分配内存空间。而派生类中没有该定义。
此时,不需要为派生类定义显式析构函数、复制构造函数和赋值运算符。
第二种情况:派生类使用new
此时,必须和基类一样,为派生类提供显式析构函数、复制构造函数和赋值运算符
对于析构函数,这是自动完成的;
对于复制构造函数,这是通过在初始化成员列表中调用基类的复制构造函数来完成的;
对于赋值运算符,这是通过使用作用域解析运算符显式地调用基类的赋值运算符来完成的;