C++学习笔记---类的继承(二)

来源:互联网 发布:幕墙下料软件 编辑:程序博客网 时间:2024/06/03 16:44
有Child类继承于Parent类
 class Child : public Parent{}
 那么,当创建一个子类对象时:(编辑器默认动作)
 子类对象构造时,先调用父类的构造函数,再调用子类的构造函数。
 子类对象析构时,先调用子类的析构函数,再调用父类的析构函数。
 当父类有多个构造函数,可以显式的调用其中的一个构造函数。
 如果没有显示调用,则调用了父类的“默认构造函数”
 class Child : public Parent
 {
public:
Child():Parent(1,1)
{
}
 }
 当一个类被继承时,应该将父类的析构函数声明为virtual,否则会有潜在的问题。
 class Parent
 {
virtual ~Parent(){}
 }
 析构函数声明为virtual为了考虑以下场景:
 Parent * p = new Child();
 delete p;
 如果析构函数没有标识为virtual,则有潜在的隐患,并有可能直接导致程序崩溃。(资源没有被释放,及延伸问题)。
 (1)类的大小由成员变量决定,与成员函数的个数无关,成员函数对所占内存空间是没有影响的。
 (2)如果有成员函数被声明为virtual,那类的大小会有些微的变化
 多重继承
 语法:
 用Father,Mother表示两个类
 class Child:public Father ,public Mother
 {
 };
 表示Child继承于Father,Mother
 在写法上,以冒号引导,每个父类用逗号隔开
 多重继承的结果:从所有父类中,继承他们所有可以被继承的成员(public/protected)
 多重继承的问题:很明显,当多个父类有相同的成员时,会影响冲突。所以一般不使用。
 纯虚函数的语法:
(1)将成员函数声明为virtual
(2)后面加上 =0
(3)该函数没有函数体
例如:
class CmdHandler
{
public:
virtual void OnCommand(char* cmdline) = 0;
};
含有纯虚函数的类,称为抽象类(或称纯虚类)。
例如,CmdHandler中有一个纯虚函数OnCommand(),因此,它是纯虚类
 抽象类不能够被实例化,即无法创建该对象。
 CmdHandler ch ; //编译错误
 CmdHandler * p = new CmdHandler();//编译错误
 抽象类/纯虚函数的实际用途:充当的“接口规范”
 接口规范:凡是遵循此规范的类,都必须实现指定的函数接口。通常是一系列接口。
 比如:
 class CmdHandler
 {
public :
virtual void OnCommand(const char* cmdline)=0;
 };
 可以理解为:凡是遵循CmdHandler规范的类,都必须实现指定的函数接口:OnCommand()