一、函数复写
1、char *mystrcpy(char *dest, const char *src);
char *mystrcpy(char *dest, const char *src)
{
char *tmp = dest;
while (*dest++ = *src++);
return tmp;
}
2、char *mystrcat(char *dest, const char *src);
char *mystrcat(char *dest, const char *src)
{
char *tmp = dest;
while (*dest) {
dest++;
}
while (*dest++ = *src++);
return tmp;
}
3、int mystrcmp(const char *s1, const char *s2);
int mystrcmp(const char *s1, const char *s2)
{
const char *d1 = s1;
const char *d2 = s2;
while (*d1 && *d2 && *d1++ == *d2++);
return *d1 - *d2;
}
4、size_t mystrlen(const char *s);
size_t mystrlen(const char *s)
{
const char *tmp = s;
size_t len = 0;
while (*tmp) {
tmp++;
len++;
}
return len;
}
二、温故知新
1、继承
1)简介
一个新的类获得了已有类的属性和方法,这个形式就是继承
【1】新的类称为子类或者派生类
【2】已有的类称为父类或者基类
书写格式:
class 派生类名 : 访问修饰符 基类名
{
};
2)方式
继承方式 | 基类成员属性 | 派生类成员属性 |
---|---|---|
public | public | public |
protected | protected | |
private | 不可见 | |
protected | public | protected |
protected | protected | |
private | 不可见 | |
private | public | private |
protected | private | |
private | 不可见 |
3)继承-----构造函数与析构函数
派生类不继承基类的构造函数,是通过调用基类的构造方法来给继承的成员进行初始化。
构造函数的调用顺序:先调用基类的构造函数,再调用派生类的 构造函数。
派生类不继承基类的析构函数,与构造函数不同,编译器在继承关系中知道如何调用析构函数。
析构函数的调用顺序和构造函数的调用顺序相反。
4)基类和派生类的函数重名
注意:
【1】派生类的同名函数遮蔽掉了基类的同名函数,在派生类中,这两个函数都存在。
【2】直接调用同名函数,默认访问的是自身类中的函数,如果想要调用基类中的函数需要通过类名指定调用。
5)多继承
C++支持多继承关系,一个派生类可以有多个基类,派生类可以继承多个基类的成员。
如果多继承的两个基类中有重名的函数,在派生类中可以通过基类的类名进行指定。
6)虚继承
虚继承是多继承中特有的概念,如:菱形继承
在零菱形继承中,为了避免在派生类中出现间接基类的成员出现双份,可以使用一个关键字来修饰-----virtual
使用virtual关键字的继承关系就是虚继承,常用于菱形继承中。
2、多态
1)概念
同一个指针,指向基类调用的是基类方法,指向派生类调用的是派生类方法。
2)多态的条件
【1】基类的成员函数一定要用virtual修饰为虚函数,派生类的成员函数可以有virtual修饰,也可以没有。
【2】派生类中的虚函数必须重写基类方法,函数名一样,返回值一样,参数列表一样。