- 编译器不检查虚函数的各类属性:pub,pro,pri。统一放于虚函数表
- 继承属性只能改变子类继承下来的元素在子类中的属性,而即使是pri继承子类同样可以访问基类继承下来的prompub属性成员
- 析构的异常处理1:try catch record abort ,2:close +flag + try catch
- 基类析构,构造别用子类的虚函数(会被解释为基类的虚函数),可以通过子类静态非虚类函数构造基类
- operator= 自赋值 return *this,new temp/copy-and-swap
- copy copy-assign 可用第三个init(pri)来代替
- 用non_member函数调用pub成员函数以提供较大封装性,若使用member函数则可访问私有,破坏分装,加大后期维护(越少访问pri越好封装性)
- class +swap(member)(using std::swap)+swap(non_member)+std::swap, template +swap(member)(using std::swap)+swap(non_member)
- 临时对象的成员指针传出可造成空悬
- copy+swap 来实现强烈保证(异常安全)(可能无法全美)。
- Handle classes(impl with obj,handle with shared_ptr impl and 可能会在构造函数使用的class的声明) ,Interface classes(static create derive class with shared_ptr)
- 使用纯虚函数,这样子类必须重写接口(避免遗忘而导致使用默认的父类虚函数),父类纯虚函数可以有实现体(可用于默认,子类必须::使用)
- NVI 父类接口pub调虚函数pri,子类可修改虚函数定义。pri虚函数子类只能重写,不能使用。若要使用 pro,pub
- 带有默认参数的虚函数会使用静态的默认参数,解决方案NVI,默认实参给
- 用list实现set (impl通过pri list+pub 接口)而非public继承,和stack deque类似,将deque 作为 模板+pro
- 将不希望让子类修改父类继承父类的父类的vitual函数可以修改结构让父类的私有成员(内部类)pub继承父类的父类。如果仅仅让父类pri继承父类的父类是不行的,子类还是可以修改虚函数,尽管他不能使用
- 需要类型转换时请为模板定义非成员函数+友元(为了生成函数,之后才能推导类型转换)
- 通过模板的友元类内定义可以让该函数自动具现化,这样就可以利用参数的类型转换(模板方可推导)
friend ostream &operator<<<>(ostream &os, A<T> a)
;需要前置声明,
或者这样
template<typename U>
friend
ostream &operator<<(ostream &os, A<U> a);
//类内声明,之后类外定义