前言:更多内容请参考《嵌入式C/C++学习路》
1.继承
class 子类 : 继承方式 父类
子类也称派生类,父类也称基类
#include<iostream>
using namespace std;
// 狗
class Dog{
public:
void bark(){
cout << "汪汪!" << endl;
}
void run(){
cout << "跑起来" << endl;
}
};
// 继承
// 警犬
class Police_d:public Dog{
public:
void defend(void){
cout << "警犬再此,坏蛋别跑!" << endl;
}
};
// 猎犬
class Hound:public Dog{
public:
void carry(void){
cout << "我是猎犬,我要抓兔子!" << endl;
}
};
int main(void){
Dog d;
d.bark();
Hound h;
h.bark();
h.carry();
Police_d p;
p.bark();
p.defend();
return 0;
}
继承的方式
- 公共继承:子类除了父类的私有部分无法访问,其他的照搬
- 保护继承:子类将父类的公有部分和保护部分变为保护部分,不可访问私有部分
- 私有继承:子类将父类的公有和保护变为私有,不可访问私有部分
继承中构造和析构的顺序
程序运行顺序如下:父类构造->子类构造->子类析构->父类析构
同名成员处理方式
访问子类同名成员,直接访问即可 对象.成员变量/函数
访问父类同名成员,需要加作用域 对象.父类::成员变量/函数
#include<iostream>
using namespace std;
class Base{
public:
Base(){
m_a = 100;
}
int m_a;
};
class Son:public Base{
public:
Son(){
m_a = 200;
}
int m_a;
};
void test01(){
Son s;
cout << s.m_a << endl; // 访问子类同名成员
cout << s.Base::m_a << endl; // 通过子类对象访问父类同名成员
}
int main(){
test01();
return 0;
}
同名静态成员
通过对象访问:
调用子类: 对象.成员变量/函数
调用父类: 对象.父类::成员变量/函数
通过类名访问:
调用子类: 子类::变量/函数
调用父类: 子类::父类::变量/函数 当然也可以直接 父类::变量/函数
注:第一个::表示通过类名的方式访问,第二个::表示访问父类的作用域
2.多态
- 静态多态:函数重载和运算符重载属于静态多态,复用函数名
- 动态多态:派生类和虚函数实现运行时多态
- 静态多态的函数地址早绑定 -编译阶段确定函数地址
- 动态多态的函数地址晚绑定 -运行截断确定函数地址
这里bark就是虚函数
#include<iostream>
using namespace std;
// 狗
class Dog{
public:
virtual void bark(){ // 虚函数
cout << "汪汪!" << endl;
}
void run(){
cout << "跑起来" << endl;
}
};
// 继承
// 警犬
class Police_d:public Dog{
public:
// 多态
void bark(){
cout<< "警犬-汪汪!" << endl;
}
void defend(void){
cout << "警犬再此,坏蛋别跑!" << endl;
}
};
// 猎犬
class Hound:public Dog{
public:
void bark(){
cout << "猎犬-汪汪~" << endl;
}
void carry(void){
cout << "我是猎犬,我要抓兔子!" << endl;
}
};
int main(void){
Dog d;
d.bark();
Hound h;
h.bark();
Police_d p;
p.bark();
return 0;
}