C++ Tips(1): Regarding Inheritance

来源:互联网 发布:xmouse软件下载 编辑:程序博客网 时间:2024/05/01 20:45

今天起开始总结一些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++规定了此时只会指向父类的方法.

 

 

 

原创粉丝点击