C++学习笔记---类的继承(二)
有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()
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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.