【发布时间】:2011-09-10 15:34:21
【问题描述】:
这是代码,我编写了 cmets。 问题是我不知道在Derive类中取消隐藏函数后会调用哪个函数。
#include <CONIO.H>
#include <IOSTREAM>
#include <string>
using namespace std;
class Base
{
string strName;
public:
Base& operator=(const Base &b)
{
this->strName = b.strName;
cout << "copy assignment" << endl;
return *this;
}
Base& operator=(string& str)
{
this->strName = str;
cout << "operator=(string& str)" << endl;
return *this;
}
};
class Derive : public Base
{
public:
int num;
using Base::operator =; // unhide Base::operator=();
};
int main(int argc, char *argv[])
{
Derive derive1;
derive1.num = 1;
Derive derive2;
Base b1;
derive1 = b1; // This will call Base& Base::operator=(const Base &b)
//no problem
string str("test");
derive1 = str; // This will call Base& Base::operator=(string& str)
// no problem
derive2 = derive1; // What function will this statement call???
// If it calls Base& Base::operator(const Base &b)
// how could it be assigend to a class Derive?
return 0;
}
但是代码的结果是:derive2.num等于1!!!,说明语句后整个类都被复制了,为什么会这样呢?
感谢托尼,我想我得到了答案。
这是我的解释:
基于C++0x 7.3.3.3和12.8.10,Derive中的using语句会这样解释
class Derive : public Base
{
public:
int num;
//using Base::operator =;
Base& operator=(const Base &b); // comes form the using-statement
Base& operator=(string& str); // comes form the using-statement
Derive& operator=(const Derive &); // implicitly declared by complier
};
所以当我写的时候:
string str("test");
derive1 = str;
函数Base& Base::operator=(string& str);将被调用,
当我写的时候:
Base b1;
derive1 = b1;
函数Base& Base::operator=(const Base &b);将被调用,
最后,当我写的时候:
derive2 = derive1;
将调用函数Derive& Dervie::operator=(const Derive&);。
【问题讨论】:
-
你试一试会发生什么?
-
@aioobe derived1 被正确复制到了 derived2,我无法解释
-
我只是关心你的编译器和平台。在我的 win7/vs2008 上,结果显示,derive2.num 将是一些随机值而不是 1。
-
@winterTTr 我正在使用 winxp/mingw(来自 Qt4)
标签: c++ inheritance operators operator-overloading