Effective C++ 6

virtual函数:接口必须被继承。

non-virtual:接口和实现都被继承。

public继承情况:Liskov Substitution Principle

Base能用的地方都能用Derived代替。

如函数参数用point或reference传递对象。

public继承的关键:is-a模型。

derived-class的名称会遮掩Base-class的名称。

例:
class Base { public: virtual void mf1()=0; virtual void mf1(int); virtual void mf2(); void mf3(); void mf3(double); }; class Derived:public Base { public: virtual void mf1();//mf1将Base的所有名称mf1的函数都遮蔽了。 void mf3();//mf3将Base所有名称为mf3的函数都遮蔽了。 void mf4(); };
如果要求Baseclass的mf1不被遮蔽,解决办法:

1.在类public中声明using Base::mf1;

如果private继承,指向继承Base class的1个mf1,则可以利用转交函数

virtual void mf1()

{

Base::mf1();

}

 

pure virtual function在base中声明,必须在derived中定义,即必须提供自己的版本,否则报错。

pure virtual目的是继承接口。

注意pure virtual也可以给出定义。可以实现即覆写又利用转换函数实现继承。

impure virtual的目的是继承接口和缺省实现,如果不定义默认继承,但derived可以覆写它。

 

80-20规则可以确定  我们一定要关注20%的代码,因为他们用了80%的时间。

 

non-virtual 继承接口和强制实现。

1.template method设计模式:

     public non-virtual成员函数调用private virtual函数 称为 non-virtual interface (NVI)

     non-virtual函数称为外覆器

     优点:可以额外做事先和事后工作。

     derived class可以重新定义继承private virtual函数。

2.function pointer实现strategy模式

     构造函数参数接受一个指针。

3.tr1::function实现strategy模式

    如:typedef std::tr1::function<int (const A&)> h;//h为任何可调用物。

        //签名代表的函数是接受一个reference指向const A 返回int

        //该设计可兼容。

只要h的参数是可以转换为const&A的,返回值能转换为int的像函数的都行。

4.传统strategy模式

   将本生的virtual函数变为一个类。

 

任何派生类都不该重新定义基类的non-virtual函数

 

virtual为动态绑定,默认参数值为静态绑定。

 

你可能感兴趣的:(Effective C++ 6)