封装:限制属性和方法,隐藏实现细节,实现模块化。有三种访问权限 public(对所有对象开放)、protected(对子类开放)、private(只对自己开放,但是可以通过友元类打破限制,关键词friend)
继承:无需修改原有类的情况下通过继承实现对功能的扩展。可以用using修改基类成员在子类中的权限
这种方法适用于基类的 public
和 protected
成员,但无法改变 private
成员的访问权限,因为派生类无法直接访问基类的 private
成员。
class Base {
public:
void publicMethod() {}
protected:
void protectedMethod() {}
private:
void privateMethod() {}
};
class Derived : public Base {
public:
// 使用 using 声明将基类的 protected 成员提升为 public
using Base::protectedMethod;
// 尝试将基类的 private 成员提升为 public会导致编译错误
// using Base::privateMethod;
};
多继承:可以同时继承多个基类
接口继承:一个接口从另一个接口派生,继承其方法签名,从而形成新的接口。
**多态:**一个接口多种形态,通过实现接口重用,增强可扩展性。
1、静态多态:函数重载,编译器确定,允许在同一作用域中声明多个功能类似的同名函数(参数个数或者类型或者参数顺序不一样导致不同形态)注意:不能通过返回值类型来区别重载。
原理:函数名修饰。
预编译:把头文件中的函数声明拷贝到源文件中,避免编译过程中的语法分析找不到函数定义。
编译:语法分析,同时进行符号汇总(函数名)
汇编:生成函数名到函数地址的映射,方便之后通过函数名找到函数定义位置,从而执行函数
链接:将多个文件中的符号表汇总合并
2、动态多态:虚函数重写,在运行时确定(首先要有继承,通过子类重写基类的虚函数实现)
虚函数重写:在基类的函数前加上virtual关键字,在派生类重写该函数,运行时会根据对象的类型来调用对应的函数。如果对象的类型是基类,则调用基类的函数。如果对象的类型是派生类,则调用派生类的函数。
原理:
早绑定:编译器编译时已经确定对象调用的函数地址。
晚绑定:若使用virtual函数,则会为类生成虚表(一维数组,存放虚函数地址),类对象构造时会初始 化该虚函数表指针。虚函数表指针在构造函数中初始化。