Operator=问题
一个偶然的机会,我看到了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




