一、枚举
cpp
enum Color { RED, GREEN, BLUE };
Color c = RED;
-
枚举值默认从 0 开始递增。
-
枚举值会暴露在所属作用域中,容易造成命名冲突。
二、继承
cpp
class Base { ... };
class Derived : public Base { ... }; // 继承方式:public/protected/private
继承方式对成员访问的影响
| 继承方式 | 基类 public 成员 | 基类 protected 成员 | 基类 private 成员 |
|---|---|---|---|
| public | public | protected | 不可直接访问 |
| protected | protected | protected | 不可直接访问 |
| private | private | private | 不可直接访问 |
构造与析构顺序
-
构造:先调用基类构造函数,再调用派生类构造函数。
-
析构:先调用派生类析构函数,再调用基类析构函数。
-
基类析构函数通常应声明为
virtual,以便通过基类指针正确析构派生类对象。
三、虚函数
虚函数(Virtual Function)
用于实现运行时多态,允许通过基类指针或引用调用派生类重写的方法。
cpp
class Animal {
public:
virtual void speak() { cout << "Animal speaks\n"; }
};
class Dog : public Animal {
public:
void speak() override { cout << "Dog barks\n"; } // override 可选但推荐
};
-
基类中声明
virtual,派生类中可重写(override关键字显式标记)。 -
虚函数通过虚表(vtable) 实现,每个含有虚函数的类都有一个虚表指针(vptr)。
-
虚函数有默认实现,子类可选择覆盖。
纯虚函数(Pure Virtual Function)
用于定义抽象基类,没有默认实现,强制派生类必须实现(除非派生类也是抽象类)。
cpp
class Shape {
public:
virtual void draw() = 0; // 纯虚函数
};
class Circle : public Shape {
public:
void draw() override { cout << "Draw circle\n"; }
};
- 含有纯虚函数的类称为抽象类,不能实例化。
虚函数使用注意事项
-
构造函数不能是虚函数。
-
静态成员函数不能是虚函数。
-
基类析构函数应声明为
virtual,否则通过基类指针删除派生类对象时可能导致未定义行为(只调用基类析构,不调用派生类析构)。
四、可见性
| 修饰符 | 类内访问 | 派生类内访问 | 外部(对象)访问 |
|---|---|---|---|
public |
✅ | ✅ | ✅ |
protected |
✅ | ✅ | ❌ |
private |
✅ | ❌ | ❌ |
-
public 继承 :基类的
public→public,protected→protected。 -
protected 继承 :基类的
public/protected→protected。 -
private 继承 :基类的
public/protected→private。