码迷,mamicode.com
首页 > 编程语言 > 详细

c++ 子类切勿重新定义父类 non-virtual函数

时间:2014-07-16 22:53:36      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   io   cti   

子类如果重新定义了父类的non-virtual函数则不会有多态效果。

为方便描述,这里的方法和继承方式都用public。至于原因嘛,你懂的!

1:子类直接继承父类方法

class BaseOption
{
public:
    void Function();
};

void BaseOption::Function()
{
    cout<<"BaseOption::Function()"<<endl;
}



class SubOption :
    public BaseOption
{
};

int _tmain(int argc, _TCHAR* argv[])
{
    SubOption obj;
    BaseOption *pBase = &obj;

 SubOption *pSub = &obj;

 pBase->Function();
 
pSub->Function();
}

输出:

"BaseOption::Function()"
"BaseOption::Function()"

这里使用BaseOption 和SubOption 调用Function都能调进BaseOption::Function();

2:为了实现多态效果,把父类Function()改为virtual,在子类中重新实现

class BaseOption
{
public:
    virtual void Function();
};

void BaseOption::Function()
{
    cout<<"BaseOption::Function()"<<endl;
}



class SubOption :
    public BaseOption
{
public:
       void Function();
};

void SubOption::Function()
{
  cout<<"SubOption::Function()"<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    SubOption obj;
    BaseOption *pBase = &obj;

 SubOption *pSub = &obj;

  pBase->Function();

 pSub->Function();
}

这就是我们常说的多态。

输出:
"SubOption::Function()"
"SubOption::Function()"

3:子类直接重新定义父类non-virtual方法,这背时的做法,在这种情况下就没有了多态属性,至于这种设计方法的弊端,没得说。

 

 

class BaseOption
{
public:
    void Function();
};

void BaseOption::Function()
{
    cout<<"BaseOption::Function()"<<endl;
}



class SubOption :
    public BaseOption
{
public:
       void Function();
};

void SubOption::Function()
{
  cout<<"SubOption::Function()"<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    SubOption obj;
    BaseOption *pBase = &obj;
    SubOption *pSub = &obj;
    pBase->Function();
    pSub->Function();
}

 

输出:
BaseOption::Function()

SubOption::Function()

虽然实例对象时SubOption obj,但在调用时候 由BaseOption指针pBase会调进BaseOption中,这也是哦,SubOption is-a BaseOption .

 

 

c++ 子类切勿重新定义父类 non-virtual函数,布布扣,bubuko.com

c++ 子类切勿重新定义父类 non-virtual函数

标签:style   blog   color   使用   io   cti   

原文地址:http://www.cnblogs.com/zhidao-chen/p/3835485.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!