为什么要继承类
面向对象的编程的主要优点之一就是提供可重复的代码,而类的继承便是为了更好地实现这一优点,具体如何实现可以参考我的另外一篇文章 面向对象的优点以及原理的简单解释
如何继承一个类
关于如何继承一个类的前提自然是你首先得有一个父类,也可以被称作基类,没有这个东西就无谈继承,所以我们先假设我们拥有父类如下代码。
class Time {
public:
Time() {
}
Time(const string &NowHour_, const string &NowMinute_) :NowHour(NowHour_), NowMinute(NowMinute_) {
}
string NowHour=" ";
string NowMinute=" ";
void ShowNowTime() {
cout << NowHour << ":" << NowMinute;
}
private:
string Myname;
};
这就是一个简单的类,类名叫做Time
,我们可以看到这个类有成员变量NowHour
,NowMinute
,却没有秒,我们想这个没有秒的时间好像有点不太完整,但是直接改上面的代码也不太好,万一有人就是需要不药秒的类呢?于是为了处于折中,我打算自已定义一个类,类名就叫myTime
在我的类里,我想写啥就写啥吧!
但是我也不想重写上面的类,因为Time
这个类里面有些功能我还是想要的,于是我就考虑继承这个类,myTime
的代码如下
class myTime :public Time {
public:
myTime(const string &NowHour_, const string &NowMinute_, const string &NowSecond_) :Time(NowHour_, NowMinute_),NowSecond(NowSecond_) {
}
string NowSecond;
void ShowNowTime2() {
cout <<NowHour << ":" << NowMinute << ":" << NowSecond << endl;
}
};
分析一下上面的代码 myTime
是我自己的类名 public
表示的是公有派生,类似的关键词还有protect
,private
然后我们看下面这一行函数
myTime(const string &NowHour_, const string &NowMinute_, const string &NowSecond_) :
Time(NowHour_, NowMinute_),NowSecond(NowSecond_) {
}
表示的是myTime
的构造函数,对于被派生的类的构造函数有几个需要注意的地方
- 被派生的类
mytime
不仅需要给他新定义的成员如NowSecond
初始化赋值,还需要给Time
内原有的成员变量赋值 - 给原有的基类的成员变量赋值方式为在构造函数后面加上
:Time(NowHour_, NowMinute_)
,不能在构造函数的大括号{}
中添加,如果没有加:Time(NowHour_, NowMinute_)
,则其会默认为:Time()
继承类(派生类)的使用
- 继承类可以调用父类(基类)的非(private修饰的)函数
mytime1.ShowNowTime();
- 基类指针可以在不进行显式类型转换的时候指向派生类的对象,但只能调用基类的方法
- 基类引用可以在不进行显式类型转换的时候引用派生类对象,但只能调用基类的方法
看到上面三条同学们可能已经有点懵了,都是啥和啥,我这里简单口语化的讲解一下
第一条表示,儿子可以用老子的东西,继承类可以调用父类的函数
第二条第三条其实讲的是类似的东西,就是父亲可以代表儿子,父类的指针可以直接指向子类的指针
如下代码所示//time2 是Time类的对象 //mytime1 是myTime类的对象 Time * time2; time2 = &mytime1; time2->ShowNowTime();//合法 time2->ShowNowTime2();//不合法
上述中ShowNowTime()
是基类函数,可以调用ShowNowTime()2
是继承类函数不可以被调用