C++ 面向对象笔记

C++面向对象

  • virtual只出现在声明,不出现在定义。

  • 派生类可以访问publicprotected成员,不可访问private成员

  • 对象之间不存在类型转换

  • 派生类向基类的类型转换只对指针和引用有效

  • 基类的引用或指针的静态类型和动态类型可能不一样。

  • 当通过基类的引用或者指针调用虚函数时,在运行时才确定下来调用的虚函数的版本,如果指针或引用绑定的是派生类的对象,那会运行派生类的虚函数。当通过对象调用虚函数时,在编译期就可以确定。

  • 继承虚函数最好在声明结尾写上override

  • 派生类可以看作和基类的连体婴儿,是一个扩充,但对基类的访问有所限制。

  • 虚函数的默认实参按调用的静态类型的默认实参决定。

  • 避免对虚函数动态绑定:使用作用域运算符:DerivedP->Base::f();。通常情况下是派生类调用其基类的虚函数版本时需要使用,基类版本通常完成所有继承层次中类型的共同任务,而派生类中的虚函数只需定义和自身密切相关的操作。

  • 在声明分号前写= 0代表纯虚函数。有纯虚函数的类是抽象类,不允许定义对象。

  • 在Quote的继承体系中增加Disc_quote类是重构,重构负责将操作或数据从一个类转移到另一个类,即使重构了继承体系,引用了Bulk_quote或Quote的代码也无需改变。

  • 派生类的类作用域嵌套在基类的作用域里,重名会将基类中的成员覆盖,而不会重载即使是参数不一样。当然可以使用作用域运算符访问被覆盖的成员Base::covered_member

  • 如果派生类的函数名与基函数的虚函数名相同,会将其隐藏而不是派生一个新的虚函数。

  • 如果想重载基类中的函数,需要在派生类中using Base::f;,然后再定义派生类的f()

  • 析构函数要定义成虚函数,防止一个Base类指针指向派生类,delete的时候选错析构函数的版本。

  • 向一个基类的容器传入派生类对象,只会将其基类的部分传入,调用虚函数的版本是基类的版本。好的做法是定义成基类的智能指针的容器,传入容器时派生类的指针会转换成基类的指针,但他指向的还是派生类对象,指针具有动态类型,调用虚函数会调用派生类版本。

  • delctype(f)获得函数类型,用decltype(f)*获得函数指针

    multiset<int, decltype(com)*> st(com);
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章