重载的赋值操作符成员函数可以声明为虚函数,为什么却不能继承啊

lixtary 2013-04-11 12:24:35
①可以是虚函数,却不能继承。
②它们同名,然而特征标不一样。
这两种情形都会导致基类指针或引用根据对象调用虚函数这一特性派不上用场,即使是虚函数也感觉没意义
那为什么不干脆禁止它是虚函数

例如基类base,派生类derive
derive do1;
base &br=do1;
.......
derive do2;
.......
br=do2;//只将do2的基类部分赋给了do1,而实际是想将do2的全部赋给do1
...全文
568 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixtary 2013-04-13
  • 打赏
  • 举报
回复
搞清楚了,的确如书上所说,不能继承 去掉派生类的这个函数Derived& operator=(const Base&aa) 在Derived& operator=(const Drived &aa)函数里加这一句operator=((const Base&)aa)程序就会报错 必须这么写Base::operator=(aa)或者base::operator=((const Base&)aa)才不会错 这个问题让我学到了很多,谢谢大家的解答
pengliqing1113 2013-04-12
  • 打赏
  • 举报
回复
virtual base& base::operator=(const base&) virtual derive& derive::operator=(const derive&) 是两个不同的虚函数,重载虚函数的条件是参数完全一样
Star-light 2013-04-12
  • 打赏
  • 举报
回复
引用 1 楼 hugett 的回复:
应该是会继承的吧。不过继承的是C/C++ code?1Derived& operator=(const Base&aa); 而不是C/C++ code?1Derived& operator=(const Derived&aa); 下边是测试的代码 C/C++ code?123456789101112131415161718192021……
1楼正解,而且请注意派生类中返回Derived&而不是Base&也算是虚函数继承,不需要完全一致

class Base{
    virtual Base& operator=(const Base&aa){
};
class Derived: public Base{
Derived& operator=(const Base&aa){
        cout<<"Derived operator= Base"<<endl;
        return *this;
    }
}
taodm 2013-04-11
  • 打赏
  • 举报
回复
楼主,你对于“继承”的定义理解错了。 所以,你才错误得出不能继承这个答案。
yubao669016 2013-04-11
  • 打赏
  • 举报
回复
可以继承,但是要重写这个函数,
lixtary 2013-04-11
  • 打赏
  • 举报
回复
引用 6 楼 lixtary 的回复:
引用 1 楼 hugett 的回复:应该是会继承的吧。不过继承的是C/C++ code?1Derived&amp; operator=(const Base&amp;aa); 而不是C/C++ code?1Derived&amp; operator=(const Derived&amp;aa); 下边是测试的代码 C/C++ code……
刚才说错了,抱歉。我的代码也是首先调用了virtual derive & operator =(const base & ba); 后来调用了virtual base & operator =(const base & ba);
lixtary 2013-04-11
  • 打赏
  • 举报
回复
引用 4 楼 tiewen 的回复:
赋值操作符允许virtual的意义和普通的多态也是一样的,要知道,赋值操作符分为拷贝赋值操作符和非拷贝赋值操作符; virtual file& binfile::operator=(const char* filename) virtual file& textfile::operator=(const char* filename)(textfi……
哦,忘了,它们的参数可以相同,我再去想想,感谢指点
lixtary 2013-04-11
  • 打赏
  • 举报
回复
引用 1 楼 hugett 的回复:
应该是会继承的吧。不过继承的是C/C++ code?1Derived& operator=(const Base&aa); 而不是C/C++ code?1Derived& operator=(const Derived&aa); 下边是测试的代码 C/C++ code?123456789101112131415161718192021……
说起来真怪,运行了下你的代码,的确调用的是Derived& operator=(const Derived&aa); 但我的却调用的virtual base & operator =(const base & ba); 我发现原因是你的类中没有数据成员,而我的类中有数据成员
铁文 2013-04-11
  • 打赏
  • 举报
回复
赋值操作符允许virtual的意义和普通的多态也是一样的,要知道,赋值操作符分为拷贝赋值操作符和非拷贝赋值操作符; virtual file& binfile::operator=(const char* filename) virtual file& textfile::operator=(const char* filename)(textfile继承binfile,在赋值时可以验证文件的内容是否全部为可视文本) virtual file& htmlfile::operator=(const char* filename)(htmlfile继承textfile,但在赋值时可以作更多的验证)
铁文 2013-04-11
  • 打赏
  • 举报
回复
virtual base& base::operator=(const base&) virtual derive& derive::operator=(const derive&) 上面的两个函数之间的区别和下面的两个有什么不同吗? virtual base& base::Fa(const base&) virtual derive& derive::Fa(const derive&) 调用base.Fa,有可能执行derive.Fa()吗? Any assignment operator, even the copy and move assignment operators, can be virtual. For a derived class D with a base class B for which a virtual copy/move assignment has been declared, the copy/move assignment operator in D does not override B’s virtual copy/move assignment operator. 虚函数实现多态的条件是基类和派生类声明的函数原型要一致(派生类中可以没有virtual) 如果实现了lz所说的功能,会发生问题: D1 d1; D2 d2; B& b = d1; b = d2;//怎么赋值?d1=d2?
赵4老师 2013-04-11
  • 打赏
  • 举报
回复
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
hugett 2013-04-11
  • 打赏
  • 举报
回复
应该是会继承的吧。不过继承的是
Derived& operator=(const Base&aa);
而不是
Derived& operator=(const Derived&aa);
下边是测试的代码

#include <iostream>

using namespace std;

class Base{
public:
	virtual Base& operator=(const Base&aa){
		cout<<"Base operator= Base"<<endl;
		return *this;
	}
};

class Derived: public Base{
public:
	Derived& operator=(const Base&aa){
		cout<<"Derived operator= Base"<<endl;
		return *this;
	}
	Derived& operator=(const Derived&aa){
		cout<<"Derived operator= Derived"<<endl;
		return *this;
	}
};

int main(){
	Base b1;
	Derived d1, d2;
	Base &br = d1;
	br.operator=(b1);
	br = d2;
	d1 = d2;
	return 0;
}

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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