c++ - 为什么我的虚拟赋值运算符没有按预期执行?
问题描述
class Base{
public:
virtual Base& operator=( const Base& ) {
std::cout << "Base::operator=( const Base& )" << std::endl;
return *this;
}
};
class Derived: public Base{
public:
virtual Derived& operator=( const Base& ) {
std::cout << "Derived::operator=( const Base& )" << std::endl;
return *this;
}
virtual Derived& operator=( const Derived& ) {
std::cout << "Derived::operator=( const Derived& )" << std::endl;
return *this;
}
};
int main(){
Derived obj1, obj2;
Base& ba=obj2;
obj1=ba;//outputs[1]: Derived::operator=( const Base&)
Derived& de=obj2;
obj1=de;//outputs[2]: Derived::operator=( const Derived& )
Base& bb=obj2;
bb=obj1; //outputs[3]: Derived::operator=( const Base&)
}
我对案例 3 输出感到困惑,不应该赋值运算符将正确的操作数作为函数参数,以便将obj1作为参数,并且由于obj1是 Derived 的类类型,因此它将调用Derived::operator=( const Derived&) ?
对于输出[3],为什么输出是Derived::operator=( const Base& ),而不是Derived::operator=( const Derived& )?
解决方案
Base 类中Derived::operator=( const Derived& )
没有覆盖候选者。我建议override
在每个旨在覆盖基类行为的方法之后添加关键字。它没有任何成本,并且可以使您的代码更安全。
如果要Derived::operator=( const Derived& )
被调用,则需要在基类中提供正确的方法签名:
class Derived; // forward declaration
class Base{
public:
virtual Base& operator=( const Base& ) {
std::cout << "Base::operator=( const Base& )" << std::endl;
return *this;
}
virtual Base& operator=( const Derived& ) {
std::cout << "Base::operator=( const Derived& )" << std::endl;
return *this;
}
};
class Derived: public Base{
public:
virtual Derived& operator=( const Base& ) override {
std::cout << "Derived::operator=( const Base& )" << std::endl;
return *this;
}
virtual Derived& operator=( const Derived& ) override {
std::cout << "Derived::operator=( const Derived& )" << std::endl;
return *this;
}
};
推荐阅读
- saml-2.0 - 索赔提供者信任和依赖方信任之间的区别
- python - 在确定 SARIMA 中的顺序和季节性顺序时是否有任何规则?
- javascript - 如何解释以下函数的声明
- events - Oracle Apex:在另一个项目更改时刷新项目
- docker - mcr.microsoft.com/dotnet/core/aspnet:2.2 for windows 容器不可用
- networkx - 如何在 networkx HITS 算法中应用权重选项
- docker - Dockerfile:没有包与 php 匹配
- ruby-on-rails - 带有 Que 和 Dockerized PostgreSQL 的 Rails 6
- python - 无法从 QName 中删除不必要的元素
- dataframe - 根据条件删除数据框的行(比较两列中的数据)