学习没有捷径,但考试有捷径
临近考试,虽然之前对一些概念搞清楚了,但时日一长,很多又模糊了。因此利用整理成章,将知识重拾。
考试的范围如下:
- 常量(const、符号、字符串常量、立即数)
- 引用和指针
- 类的封装和隐藏(静态成员、友元函数)
- 类的初始化(初始化方式和顺序)
- 类的继承(继承方式、构函列表、多继承)
- 类的多态性(函数重载、运算符重载、虚函数、虚函数表)
- 类的作用域概念
继承
基类
派生类 继承所有数据成员和函数(除析构和构造)无论属性,友元关系不可继承
面向对象编程语言的两大类型
- 单继承:只有一个基类,树形
- 多继承:可以有多个基类,有向图型
class Date
{
public:
Date();//constructor
void setDate(int, int, int);//set year, month, day
void printStandard();
private:
int year;
int month;
int day;
};
class Time:public Date
{
public:
Time();//constructor
void setTime(int, int, int);//set hour, minute, second
void printUniversal();
void printStandard();
private:
int hour;//0-23
int minute;//0-59
int second;//0-59
};
void Time::setTime(int h, int m, int s)
{
if ((h >= 0 && h < 24) && (m >= 0) && (m < 59) && (s >= 0) && (s < 59))
{
hour = h;
minute = m;
second = s;
}
else
throw invalid_argument("out of range");
}
void Date::printStandard()
{
cout << setfill('0') << setw(4) << year << "-" << setw(2) << month << "-" << setw(2) << day << endl;
}
void Time::printUniversal()
{
Date::printStandard();
cout << setfill('0') << setw(2) << hour << ":" << setw(2) << minute << ":" << setw(2) << second << endl;
}
void Time::printStandard()
{
Date::printStandard();
cout << setfill('0') << setw(2) << hour%12 << ":" << setw(2) << minute << ":" << setw(2) << second << endl;
}
int main(void)
{
Time d;
try
{
d.setDate(2019, 11, 14);
d.printStandard();
d.setTime(21, 50, 39);
d.printStandard();
}
catch (invalid_argument& e)
{
cout << "exception: " << e.what() << endl;
}
Time w;
try
{
w.setTime(25, 29, 39);
}
catch (invalid_argument& e)
{
cout << "exception: " << e.what() << endl;
}
w.printStandard();
return 0;
}
三种继承方式:
- 公有继承:私有不可访问,其余可访问,属性不变
- 私有继承:私有不可访问,其余成为私有属性
- 保护继承:私有不可访问,其余成为保护属性
继承方式具有传递性
保护成员:可以被自身和派生类的成员函数访问,其余不可
多继承
可能产生二义性
二义性判断:
- 在检查类型之前
- 在检查可访问属性之前
引入虚基类,虚函数解决冲突问题
虚基类:定义一次
虚函数:重新定义