读书人

满载的赋值操作符成员函数可以声明为虚

发布时间: 2013-04-21 21:18:07 作者: rapoo

重载的赋值操作符成员函数可以声明为虚函数,为什么却不能继承啊
①可以是虚函数,却不能继承。
②它们同名,然而特征标不一样。
这两种情形都会导致基类指针或引用根据对象调用虚函数这一特性派不上用场,即使是虚函数也感觉没意义
那为什么不干脆禁止它是虚函数

例如基类base,派生类derive
derive do1;
base &br=do1;
.......
derive do2;
.......
br=do2;//只将do2的基类部分赋给了do1,而实际是想将do2的全部赋给do1
[解决办法]
应该是会继承的吧。不过继承的是

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;
}

[解决办法]
赋值操作符允许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,但在赋值时可以作更多的验证)

[解决办法]
引用:
应该是会继承的吧。不过继承的是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;
}
}

读书人网 >C++

热点推荐