今天起开始总结一些C++中的Tip, 首先开始的是继承.
1. 我们知道在c++中,父类中的私有函数在子类中是不可见, 这的确是正确的. 但是这个却对于virtual的方法无效.
如下所示, 尽管在父类中P1,P2是私有的,但是在子类中依然可以重写这2个virtual的方法. 并且可以在子类中扩大重写方法的可见性.
下面的代码描述了template design pattern, 定义一个骨架, 并且在子类中将细节的小片方法重写达到动态的目的, 同样也可保证virtual的可见性,将不能被直接访问到.
由上可知,尽量将virtual函数放在private里,这样能避免virtual函数有多重意义 - 既作为可用户不同实现的点和接口
2. 继承中的隐藏
在继承结构中, 子类的同名函数定义会将父类的对应函数覆盖掉,而不管是否参数一致.
来看个例子:
当子类定义了个同名的函数f(char)时, 在子类的对象上调用f方法时(父类的对象无此烦恼),会将父类的同名方法屏蔽掉,而不管它是不是最适合的函数. 解决方法是可以加入using base:func语句使得它可见. 当此方法是virtual方法, 结果是一样的, 要特别小心. 以下是一种解决方法:
3. 在父类构造或者析构函数中调用virtual函数, 并且在子类中重写了这个方法. 则在子类的对象中调用时是指向父类的方法还是子类的, 同时this 指针(包括typeid)在那时是父类的还是子类的?
来看段代码:
由上可见, 即使是在子类的对象上调用, 并没有发生我们预想的动态绑定, 也就是说调用的还是父类的方法,同时this指针在那时也是指向父类的.
为什么会这样呢? 原因是, 想象种情况, 如果在子类的virtual函数中使用了子类中的成员, 此时在基类的构造函数中使用了这个函数, 而子类并没有构造完毕, 如果指向子类的函数的话, 结果不能预测. 为了避免这种情况, c++规定了此时只会指向父类的方法.