CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

Operator=问题

楼主lsl831224(不信bu迷糊)2006-07-22 21:29:15 在 C/C++ / C++ 语言 提问

一个偶然的机会,我看到了C++标准的[13.5.3]中有这么一段话:  
  Any   assignment   operator,   even   the   copy   assignment   operator,   can   be   virtual.   [Note:   for   a   derived   class   D   with   a   base   class   B   for   which   a   virtual   copy   assignment   has   been   declared,   the   copy   assignment   operator   in   D   does   not   override   B’s   virtual   copy   assignment   operator.   [Example:  
          struct   B   {  
                  virtual   int   operator=   (int);  
                  virtual   B&   operator=   (const   B&);  
          };  
          struct   D   :   B   {  
                  virtual   int   operator=   (int);  
                  virtual   D&   operator=   (const   B&);  
          };  
          D   dobj1;  
          D   dobj2;  
          B*   bptr   =   &dobj1;  
          void   f()   {  
                  bptr->operator=(99);   //   calls   D::operator=(int)  
                  *bptr   =   99;   //   ditto(同上)  
                  bptr->operator=(dobj2);   //   calls   D::operator=(const   B&)  
                  *bptr   =   dobj2;   //   ditto(同上)  
                  dobj1   =   dobj2;   //   calls   implicitly-declared  
                                                //   D::operator=(const   D&)  
  }  
  —end   example]   —end   note]  
   
  其中[note]里面的一段话我不理解:“for   a   derived   class   D   with   a   base   class   B   for   which   a   virtual   copy   assignment   has   been   declared,   the   copy   assignment   operator   in   D   does   not   override   B’s   virtual   copy   assignment   operator”。这句话如果我没翻译错意思为:“基类B,子类D,B中声明了一个虚拟的operator=,则D中的operator=‘不能’重写(override)B中的虚拟operator=”。但是怎么会“不能重写”呢?应该是“能够重写”吧?而且在它下面举的例子中,前四个不都是调用子类‘重新定义’的operator=么?这不就是“重写(override)”么??  
   
  望高手指点迷津。 问题点数:30、回复次数:17Top

1 楼du51(郁郁思扬)回复于 2006-07-22 21:50:18 得分 0

调用的是this指针所指的函数.Top

2 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-22 22:01:19 得分 0

*bptr   =   99;   //   ditto(同上)  
  *bptr   =   dobj2;   //   ditto(同上)Top

3 楼lsl831224(不信bu迷糊)回复于 2006-07-22 22:10:46 得分 0

什么意思?二位高手,能不能说的详细一点呢?谢谢Top

4 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-22 22:12:47 得分 5

这段话表达的意思显然有点问题:  
  bptr->B::operator=(99);  
  bptr->operator=(99);  
   
  这样看起来,  
  是已经被   override   了的   ...Top

5 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-22 22:15:08 得分 0

也许那个作者写错了,  
  不是   overload   是很好理解的   ...  
   
  不是   override   ...  
  但是事实看起来就是已经完成了   override   ...  
  楼主看看书本有没有勘误一类的东东   ...Top

6 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-22 22:16:47 得分 0

struct   B   {  
          public:  
                  virtual   int   operator=   (int   v){val   =   v;cout<<"Base"<<endl;};  
          private:  
                  int   val;  
          };  
  struct   D   :   public   B   {  
                  virtual   int   operator=   (int   v){val   =   v;cout<<"Drived"<<endl;};  
          private:  
                  int   val;  
          };  
     
  int   main(int   argc,   char*   argv[])  
  {  
                  D   dobj1;  
                  B*   bptr   =   &dobj1;  
                  bptr->B::operator=(99);   //   calls   B::operator=(int)  
                  bptr->operator=(99);         //   calls   D::operator=(int)  
                  (*bptr).operator=(99);     //   ditto(同上)  
   
          system("pause");  
          return   0;  
  }Top

7 楼lsl831224(不信bu迷糊)回复于 2006-07-24 12:22:03 得分 0

to   jixingzhong(瞌睡虫:选择了远方,只顾风雨兼程!)   :  
   
        我看到是C++标准规格书啊(一共768页,2003年第二版的),难道标准规格书还会有错误么?或者标准规格书也有“勘误”?Top

8 楼wxc2006()回复于 2006-07-24 13:06:45 得分 5

首先搞清楚一个概念:  
  c++   有几种   member   function   不能被继承  
  1.   constructor   不能被继承.    
  2.   destructor   不能被继承.    
  这应该很好理解吧.   你不能说调一个从父类继承下来的   constructor   就把   一个子类给初始化了对吧.      
  3.   operator=   也不能被继承.      
  为什么?   因为   =   的性质和   constructor   有相似之处,   就是说你不能靠   =   父类的实例就说你初始化了一个子类的实例,   因为你不知道子类是怎么定义的.     所以   c++   不允许你这样做.      
   
  好了现在问题就了结了,   你都不能继承,   又怎么   override   父类的   virtural   operator=   呢?  
   
  综上所述,    
  the   copy   assignment   operator   in   D   does   not   override   B’s   virtual   copy   assignment   operator  
  这句话没有错.  
   
  Top

9 楼wxc2006()回复于 2006-07-24 13:10:32 得分 0

所以有很多人说c++   设计得不是很干净  
  就比如这里,   允许   operator=   为虚函数,   激发你重写的欲望  
  但它根本不能被继承  
  这不是搞笑吗  
  Top

10 楼sakurako(看晨雾散开,你就是我一生的最爱...)回复于 2006-07-24 13:22:47 得分 0

markTop

11 楼wxc2006()回复于 2006-07-24 13:23:32 得分 0

所以,   楼主引用的例子里面,   子类调用的是自己的   operator=,   看起来好像是   "override"   了,   其实只是调了自己的operator=,   和父类根本无关.Top

12 楼sinall()回复于 2006-07-24 14:22:56 得分 0

语法上复写了,  
  语意上没有复写Top

13 楼lsl831224(不信bu迷糊)回复于 2006-07-26 13:43:18 得分 0

to   wxc2006()   :  
   
      但是通过“基类的指针”能够调用子类的operator=,这不就是“override”么?  
      还有“*bptr   =   99;”这个也是调用子类的operator=,这不也是“override”么?  
  Top

14 楼genius_hb(本人很差)回复于 2006-07-26 18:04:33 得分 10

标准的话是对了,楼主可以看看primer中关于operator=的描述。  
   
  注意是copy   assignment,而不是operator   assignment。  
  标准说的意思是:  
  virtual   B&   B::operator=   (const   B&);  
  不能够override    
  virtual   D&   D::operator=   (const   D&);    
  只有接受一个本类类型引用(一般有const)参数的operator   assignment才能称得上是  
  copy   assignment。而不是指所有的operator=  
   
  Top

15 楼lsl831224(不信bu迷糊)回复于 2006-07-27 12:21:38 得分 0

to   genius_hb(本人很差)   :  
   
  标准说的意思是:  
  virtual   B&   B::operator=   (const   B&);  
  不能够override    
  virtual   D&   D::operator=   (const   D&);    
  ------------------------------------------  
  是不是反了阿,应该是:  
  标准说的意思是:  
  virtual   D&   D::operator=   (const   D&);    
  不能够override    
  virtual   B&   B::operator=   (const   B&);  
  对不对啊?  
   
  Top

16 楼genius_hb(本人很差)回复于 2006-07-27 20:38:35 得分 0

呵呵,写反了,是重上面拷贝过来的,放反了位置。。。。。。。  
  你明白我的意思了就行Top

17 楼OOPhaisky(异化$渴望成功~~)回复于 2006-07-29 11:13:36 得分 10

楼主可能对英文字眼理解的不太好。  
  ------------------------------------------------------  
  for   a   derived   class   D   with   a   base   class   B   for   which   a   virtual   copy   assignment   has   been   declared,   the   copy   assignment   operator   in   D   does   not   override   B’s   virtual   copy   assignment   operator.  
  ------------------------------------------------------  
  这里说的是:子类的“copy   assignment   operator”不能“override”基类的“copy   assignment   operator”。注意,这里说的是“copy   assignment   operator”,而基类和子类的“copy   assignment   operator”不可能有相同的参数类型(当然了,由于C++语言后期的一个性质,使得返回类型可以有一些出入),举个例子:  
  class   Base{  
  public:  
              virtual   Base&   operator=(const   Base   &b);//参数类型为const   Base   &  
  };  
  class   Derived   :   public   Base{  
  public:  
              Derived&   operator=(const   Derived   &d);//参数类型为const   Derived   &  
  };  
  由于参数类型不同,所以子类的copy   assignment   operator不能“override”基类的copy   assignment   operator,而是“hide”基类的copy   assignment   operator。Top

相关问题

关键词

得分解答快速导航

  • 帖主:lsl831224
  • jixingzhong
  • wxc2006
  • genius_hb
  • OOPhaisky

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo