派生类作为分配运算符的参数-不能按预期工作. [英] Derived classes as parameters to assignment operator - doesn't work as expected.

查看:81
本文介绍了派生类作为分配运算符的参数-不能按预期工作.的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好,说我有以下课程:

Ok, say I have the following classes:

class MyBaseClass;
class MyDerivedClass : public MyBaseClass;

class MyBaseAssigneeClass
{
    //base class assignment operator:
    virtual MyBaseAssignableClass& operator = (const MyBaseClass& that);
};

class MyDerivedAssigneeClass : public MyBaseAssignableClass
{
    //overloaded class assignment operator:
    virtual MyDerivedAssignableClass& operator = (const MyBaseClass& that);
};


以及以下代码:


And the following code:

MyDerivedAssigneeClass MyDerivedAssigneeClassInstance;
MyDerivedClass MyDerivedClassInstance;

//should call MyDerivedAssigneeClass::operator = (const MyBaseClass&) right?
MyDerivedAssigneeClassInstance = MyDerivedClassInstance;  


出乎意料的是,调用的是BASE类(MyBaseAssigneeClass)中的运算符.操作员根本不会过载.如果我将MyDerivedAssigneeClass更改为:


Unexpectedly, it''s the operator in the BASE class (MyBaseAssigneeClass) that gets called. The operator is not overloaded at all. If I change MyDerivedAssigneeClass to:

class MyDerivedAssigneeClass : public MyBaseAssignableClass
{
    //overloaded class assignment operator:
    virtual MyDerivedAssignableClass& operator = (const MyBaseClass& that);

    //Explictly overload assignment from MyDerivedClass
    //Call the other overload with that argument cast to MyBaseClass
    MyDerivedAssigneeClass& operator = (const MyDerivedClass& that) { return operator = (static_cast<const MyBaseClass&>(that)); }
};


然后就可以了.我错过了什么吗?


Then it works. Have I missed something?

推荐答案

我对您的命名有些困惑.我应该说它按预期工作.
Im a little bit confused with your naming. What should i say it works as expected.
class MyBaseClass{};
class MyDerivedClass : public MyBaseClass{};

class MyBaseAssigneeClass
{
public:
    //base class assignment operator:
    virtual MyBaseAssigneeClass& operator = (const MyBaseClass& that)
    {
      _tprintf(__T("MyBaseAssigneeClass\r\n"));
      return *this;
    }
};

class MyDerivedAssigneeClass : public MyBaseAssigneeClass
{
public:
    //overloaded class assignment operator:
    virtual MyDerivedAssigneeClass& operator = (const MyBaseClass& that)
    {
      _tprintf(__T("MyDerivedAssigneeClass\r\n"));
      return *this;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
  MyDerivedAssigneeClass    MyDerivedAssigneeClassInstance;
  MyDerivedClass            MyDerivedClassInstance;

  //should call MyDerivedAssigneeClass::operator = (const MyBaseClass&) right?
  MyDerivedAssigneeClassInstance = MyDerivedClassInstance;  

  _gettch();
  return 0;
}


输出:


output:

MyDerivedAssigneeClass


问候.


尝试仅在基类中定义=运算符,并使用可覆盖的方法:

Try to define the = operator in the base class only and use an overridable method:

class MyBaseClass
{
public:
    MyBaseClass& operator = (const MyBaseClass& that)
    {
        return Assigns(that);
    }
protected:
    virtual MyBaseClass& Assigns(const MyBaseClass& that)
    {
        ...
        return *this;
    }
};
class MyDerivedClass : public MyBaseClass
{
protected:
    virtual MyBaseClass& Assigns(const MyBaseClass& that)
    {
        ...
        return *this;
    }
};


感谢您的回复,但是,我给的例子错了.该死的,对不起.让我再试一次.

Thanks for the replies chaps, but gah, I''ve given the example wrong. Dammit, sorry. Let me try again.

class MyBaseClass
{
    //base class assignment operator:
    virtual MyBaseClass& operator = (const MyBaseClass& that);
};
class MyDerivedClass : public MyBaseClass
{
    //overridden assignment operator:
    virtual MyDerivedClass& operator = (const MyBaseClass& that);
};



以及以下代码:



And the following code:

MyDerivedClass MyObj1;
MyDerivedClass MyObj2;

//should call MyDerivedClass::operator = (const MyBaseClass&) right?
MyObj1 = MyObj2;  



我本来希望它与上面的mbue示例相同,但是在我的代码中却没有.

我希望将MyObj2隐式转换为MyBaseClass并在派生类中重写重写的赋值运算符.但这不是;基类版本被调用.我必须添加:



I would have expected this to work the same as the example that mbue posted above - but in my code, it doesn''t.

I would expect that MyObj2 would be implicitly cast to a MyBaseClass and the overridden assignment operator in the derived class called. But it isn''t; the base class version is called. I have to add:

MyDerivedClass& operator = (const MyDerivedClass& that) { return operator = (static_cast<const MyBaseClass&>(that)); }



明确接受派生类的参数.

再说一遍,我有什么想念的吗?



to explicitly accept an argument of my derived class.

Again, is there something I''m missing?


这篇关于派生类作为分配运算符的参数-不能按预期工作.的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆