Chinaunix首页 | 论坛 | 博客
  • 博客访问: 972028
  • 博文数量: 58
  • 博客积分: 10192
  • 博客等级: 上将
  • 技术积分: 1845
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-22 21:24
文章分类

全部博文(58)

文章存档

2011年(11)

2010年(12)

2009年(20)

2008年(15)

分类: C/C++

2009-07-02 23:30:02

条款37:绝对不要重新定义继承而来的非虚拟函数
1.适用于Base对象的每一件事,也适用于Derived对象,因为每一个Derived对象都是一个B对象。
2.Base的subclass一定会继承非虚拟函数(假设为mf)的接口和实现。

现在如果Derived重新定义非虚拟函数mf,并且与Base的mf不同,那就与“每个Derived都是一种Base”相悖。这种情况下Devried不应该以Public方式继承Base。
如果以Public继承且mf实现与Base不同,那么mf就无法反映出“不变性凌驾于变异性之上”的性质。在这种情况下,mf应该声明为虚拟函数。

条款38:绝对不要重新定义继承而来的缺省参数值

首先重新定义一个缺省参数值的办法就是重新定义一个继承而来的函数,然后重新定义一个继承而来的非虚拟函数永远是错误的行为(见上条款37),所以讨论局限于继承一个带有缺省参数值的虚拟函数。


虚拟函数系动态绑定(dynamiclly bound),而缺省参数值确实静态绑定(statically bound)。

对象静态型别(static type)是程序声明它是所采用的型别。动态型别指对象目前代表的性别。动态型别可以表现出一个对象的行为模式。如shape *p = new rectangle;静态型别位shape,而动态型别是rectangle。


#include <iostream>
class base1
{
public:
    virtual void Get(int a = 9)
    {
        _a = a;
        std::cout<<"Base: "<<_a<<std::endl;
    };
private:
    int _a;
};

class derived1:public base1
{
    public:
        virtual void Get(int a = 10)
        {
            _aa = a;
            std::cout<<"Derived: "<<_aa<<std::endl;
        }
    private:
        int _aa;
};

int main(int argc,char *argv[])
{
    base1 *p = new derived1();
    base1 *pd = new base1();

    p->Get();
    pd->Get();

    return 0;
}

[root@localhost c++_dir]# ./a.out
Derived:        9 //还是使用的base1的缺省值9
Base:   9

阅读(1107) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~