- 前言
- 一、虚函数与纯虚函数
- 1.虚函数与纯虚函数的概念
- 2.虚函数要加override
- 3.虚析构函数
- 二. 内存四区
- 2.1 程序运行前
- 2.2 程序运行中
前言
例作为传统的车辆工程的学生,转码之路可谓艰辛。本章博客记录转码过程遇到的C++基本知识,作为日后复习用。
一、虚函数与纯虚函数 1.虚函数与纯虚函数的概念
虚函数是实现多态的基础。如下所示,fun1是虚函数,func2是纯虚函数。
多态是指:不同类的对象对同一消息的不同响应。
动态绑定是指:根据不同的条件将基类指针指向不同的派生类。
class base {
public:
virtual void func1() {
cout << "11" << endl;
};
virtual void func2() = 0;
};
class child {
public:
virtual void func1() {
cout << "22" << endl;
};
virtual void func2() {
cout << "33" << endl;
};
};
如果没有func2,基类是可以实例化的。有纯虚函数的类不可以实例化。
base *p = new base();
只有通过基类指针或引用调用虚函数时,才会发生动态绑定。
child c; base *p = &c; // 基类指针 base &ref = c; // 基类引用2.虚函数要加override
在派生类重写虚函数时,要加override,表示你一定重载的是某个基类的函数。
virual void fun() override {};
3.虚析构函数
一般派生类在执行构造函数时,先执行基类,再执行子类。
若析构函数不是虚函数,则delete时,仅调用基类的虚构函数,子类的虚构函数不会调用。因此要将基类的析构函数声明为虚函数,才能先调用基类,再调用子类。
base *p = new child(); delete(p); // 执行结果如下 // base() -> child() -> ~child() -> ~base()二. 内存四区
内存四区我个人觉得内容不难。
2.1 程序运行前程序运行前只用到了代码区和全局区。
代码区存放程序的机器指令。是只读的,防止修改。
全局区存放全局变量、静态变量与全局常量。
#include2.2 程序运行中using namespace std; // 全局变量在全局区 int a = 1; // 全局常量在全局区 const int b = 2; // 全局静态变量在全局区 static int c = 3; int main() { // 局部变量在栈区 int d = 4; // 局部常量在栈区 const int e = 5; // 局部静态变量在全局区 static int f = 6; return 0; }
在程序运行中,部分变量在栈区(stack)与堆区(heap)。
栈区存放的是局部变量,形参。由编译器自动分配。
// a和b都是形参,在栈区
int func(int a, int b) {
// c是局部变量,在栈区
int c = 3;
return a + b + c;
}
堆区存放的是由malloc或new开辟出来的变量。需要由程序员自行开辟与释放。
int main() {
// *head是局部变量,存在栈区,栈区内容是指向堆区的地址,堆区存放着对应的量
TreeNode* head = new TreeNode();
// 需要由程序员自行释放
delete(head);
return 0;
}



