面向对象三大特性
封装 Encapsulation
将客观事物抽象为类,隐藏对象的内部属性和实现细节,只通过对外提供的公开接口(如 getter/setter)进行访问。继承 Inheritance
一个类(子类/派生类)从另一个类(父类/基类)中继承属性和方法,同时可以扩展新的功能,实现代码复用减少冗余。多态 Polymorphism
同一接口在不同情形下有不同的表现形式。简单来说,即父类指针或引用指向子类对象,并调用子类重写后的方法。
如果多个派生类同时实现了一个接口,通过实例化此接口也可以展现出多态的特性。
虚函数
当继承链中虚函数 >= 1,则在compile time编译时生成虚函数表vtable映射到虚函数
继承链中的每个包含虚函数的类都有一个属于自己的 vtable (虚函数表)
在runtime运行时,子类的构造函数中为vptr赋值指向vtable
父类指针调用虚函数时,子类复写的虚函数被调用
查询vtable找到虚函数的入口地址并执行
父类指针指向子类对象,或父类引用绑定子类对象,父类对象vptr变成子类对象vptr,查询子类vtable
virtual vs. new
Note: virtual + override are resolved at runtime (so override really overrides virtual methods), while new just create new method with the same name, and hides the old, it is resolved at compile time -> your compiler will call the method it ‘sees’.