2026-07-15 06:14:56
直接使用delete操作符释放动态分配的对象时,会调用该对象的析构函数。
若通过基类指针删除派生类对象,且基类析构函数为虚函数,则能确保调用派生类的析构函数,避免资源泄漏。
重载:同一作用域内同名函数通过参数列表区分,编译时确定调用版本。
模板:编译器根据模板实例化生成特定代码,如template<typename T> void func(T a) {}。
虚函数与覆盖:通过虚函数表(vtable)和虚函数指针(vptr)实现。基类指针指向派生类对象时,调用派生类覆盖的虚函数。
纯虚函数:声明为virtual int fun() = 0;的虚函数,强制派生类实现,用于抽象基类。
动态绑定:函数调用版本由实参类型在运行时决定,如基类指针调用派生类方法。

安全自动转换:派生类指针/引用转为基类指针/引用,如Derived* d; Base* b = d;。
需动态类型识别(RTTI):基类指针/引用转为派生类指针/引用需显式使用dynamic_cast,如Base* b; Derived* d = dynamic_cast<Derived*>(b);。
失败处理:若转换失败,dynamic_cast返回nullptr(指针)或抛出异常(引用)。
优点:表达“is-a”关系,支持方法重写以扩展功能。
缺点:
父类内部细节对子类可见,破坏封装。
编译时确定方法行为,无法运行时动态修改。
父类修改需同步调整子类,耦合度高。
优点:
隐藏内部细节,仅通过接口访问成员对象。
低耦合,修改成员类不影响当前类。
支持运行时动态绑定成员对象(如通过set方法替换)。
缺点:
需管理更多对象,可能增加复杂度。
需精心设计接口以协调多个成员对象。
可取地址、有名字的值,如变量int a = 10;中的a。
可出现在赋值语句左侧(如a = 20;)。
纯右值(prvalue):临时对象或字面量,如b + c、42。
将亡值(xvalue):即将被移动的对象,如std::move(a)的返回值。
不可取地址,通常作为临时值使用。
左值引用:绑定到左值,如int& ref = a;。
右值引用:绑定到右值,如int&& rref = b + c;,用于移动语义和完美转发。
常量左值引用:可绑定到右值(如const int& ref = 42;),但仅限只读访问。