分数只给一个人

cshchina 2002-02-05 04:40:49
1。重载运算符的格式是
ReturnType operator @(参数表)
{
……
return ReturnTypeObj;
}
但我有个地方不明白:
#include<iostreaam.h>
class B{
int x,y,z;
public:
B(int xx=0;int yy=0;int zz=0);
B operator =(B t);
}
B::B(int xx,int yy,int zz){x=xx;y=yy;z=zz;}
B B::operator=(B t)
{ x=t.x;
y=t.y;
z=t.z;
return *this;
}
在上面重载‘=’可否如此:
class B{
int x,y,z;
public:
B(int xx=0;int yy=0;int zz=0);
void operator =(B t);
}
void B::operator=(B t)
{ x=t.x;
y=t.y;
z=t.z;
}
请说明理由!

2。我的教科书上说:“如果在派生类中定义了与基类虚函数同名而参数特征不同的成员函数,则被c++看作是一般的函数重载,在这种情况下函数将失去虚特性。”
请问:“是重载上去的函数无虚特性还是原来从基类继承来的虚函数无虚特性?(即重载会屏蔽虚函数吗?)”




...全文
92 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Last_Dodo 2002-02-08
  • 打赏
  • 举报
回复
1。赋值运算符可不返回值,它不能用于连等是因为b1=b2=b3中,b2=b3先做然后返回void,但b1=void不允许。
2。C++语言中函数的searching scope和顺序是:
a. 比较函数名,如找到做下一步,找不到则到父类找.
b. 比较参数,若不对报错而不到父类去找。
所以:
class A
{
virtual void fn(int);
};
class B : public A
{
void fn(void);
};
...
B *b=new B;
b->fn(1);//报错,因为在B中可找到函数fn但参数不合。编译器不会到A里找。
b->fn();//调用B::fn

cshchina 2002-02-08
  • 打赏
  • 举报
回复
thank u everyone !
但是为什么用这种方法重载‘=’的话,b1=b2=b3就通不过编译???
yanwl 2002-02-06
  • 打赏
  • 举报
回复
对不起,对不起,总是写错
是:
我在A类中定义函数A::foo(void); A::foo(int); A::foo(double);
在B类中定义B::foo(int); B::foo(double);
在这种情况下
对于
B b;
b.foo(1); //正确
b.foo(1.00); //正确
b.foo(); //错误
b.A::foo(); //正确
ice2002 2002-02-06
  • 打赏
  • 举报
回复
???不明白
yanwl 2002-02-06
  • 打赏
  • 举报
回复
更正:
我在A类中定义函数A::foo(void); A::foo(int); A::foo(double);
在B类中定义B::foo(void); B::foo(int);
yanwl 2002-02-05
  • 打赏
  • 举报
回复
比如说:
我在A类中定义函数A::foo(void); A::foo(int);
在B类中定义B::foo(void); B::foo(int); B::foo(double);
而B派生自A类
那么:A::foo(void); A::foo(int); A::foo(double);是重载
B::foo(int); B::foo(double); 是重载
但是 A::foo(void); 和 B::foo(double);却没有任何关系。
而既然不是重载,就应当和重载在形式上有所区别。
所以编译器就不允许出现
B b;
b.foo(); //哦噢!错误!不存在此重载!
这种情况。
这些情况相当复杂,有的地方我也只是做了一些猜测,恳请高手指正。

yanwl 2002-02-05
  • 打赏
  • 举报
回复
不对了!
像dongyingtao(dongyingtao)那样的做法编译通不过,真的,我试过的,VC60
虽然我也不是很明白,但我认为
实际上这已经并不是普通的函数重载了
由于A::foo()是虚函数,对于C派生至B而言,virtual A::foo()对C::foo()仍然有作用,但是如果对于B类来说,情况比较复杂。
就拿dongyingtao(dongyingtao)的例子来说
首先,b->fn(1)已经不能用,要改为b->A::fn(1);否则编译必然通不过。这是因为在B中定义了函数fn()所以编译器加的this是B类的而不是A类的(我的猜测),或者另一种说法是编译器并不把A::fn(int)与B::fn(void)看成是一种函数重载,尽管这种要求在某些情况下是可以的。因为这看似合理的情况往往会带来一些麻烦。
dongyingtao 2002-02-05
  • 打赏
  • 举报
回复
'='号可以象你那样重载,这只表明b1=b2这样的表达式返回值类型为void。不过想这样写的话,下面的语句就不能通过编译了:
b1=b2=b3

2.举个例子吧:
class A
{
virtual void fn(int);
};
class B : public A
{
void fn(void);
};
这时B中的fn和A中的fn是两个函数,如果有
B *b=new B;
b->fn(1);//调用A::fn
b->fn();//调用B::fn
yanwl 2002-02-05
  • 打赏
  • 举报
回复
1、如果改成后边那样的话,那么如下面的情况连续赋值
B b1,b2,b3(1,2,3);
b1=b2=b3;
就会出错了
而前面那样重载则没有问题。
2、那样做不太好,严格地说既不是虚函数继承也不是函数重载。而且容易产生错误。
但是如果非得这么做的话
那么我举一个例子:
#include<iostream.h>
class A
{
public:
virtual void foo(){cout<<"a"<<endl;}
};
class B:public A
{
public:
virtual void foo(int i){cout<<"b"<<endl;}
};
class C:public B
{
public:
virtual void foo(){cout<<"c"<<endl;}
};
void main(void)
{
A *pa;
pa=new B;
pa->foo(); //结果是"a"
pa->foo(0); //出错,因为pa是A类指针,不能调用B类成员函数
pa=new C;
pa->foo(); //结果是"c",因为A类的foo()为虚函数。
}
这样你明白了吗?
zhang1000 2002-02-05
  • 打赏
  • 举报
回复
1.我想是可以的,但不好.因为既然要接受赋值就必须可写,如果返回void类型,则连续赋值时就会出现问题.而且返回应该是引用而不宜是值.
2.无虚特性只是对继承类来讲,如果你把他做为基类被其他类继承就失去虚特性.如果从重载前的基类继承则仍然具有虚特性.

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧