繁体   English   中英

具有继承和虚拟基类的赋值运算符

[英]Assignment operator with Inheritance and virtual base class

我有一个抽象的虚拟基类Foo,我从中抽象了许多其他类,它们之间的差异很小。 我有一个工厂,该工厂创建派生类并返回Foo *。 我最大的问题之一是操作员过载,我需要确保DFoo1不会操作DFoo(未显示)。 我目前已经通过检查强制转换是否失败来处理此问题,但是我对这种方法不满意。 我必须使用基本实现,因为我只能从工厂返回基类。 如果这是最好的方法,那很好,我只是想确保这是有道理的,并且没有我缺少的模式。 非常感谢有关如何处理此类问题的任何建议。

 class Foo
 {
    public:
          Foo(int x){...};
          Bar m_bar;
          virtual Foo& operator=(const Foo& f)
          {
             m_bar = f.m_bar
          }
 }

现在,我的派生类

class DFoo : public Foo
{
     DFoo(int x, int y):Foo(int x) {...}
     FooBar m_foobar;

     Foo& operator=(const Foo& rhs)
     {
        if(this != &rhs)
        {

              Foo::operator=(rhs);
              DFoo temp = static_cast<DFoo>(rhs);

              if(temp != NULL)
              {
                m_foobar = static_cast<DFoo>(rhs).m_foobar;
              }
              else
                 throw exception(ex);
        }
     }
}

您可能正在寻找boost :: noncopyable

在这种情况下,最明智的做法是声明赋值运算符并复制构造函数,但不定义它们。 然后,如果有人在代码中某处尝试进行复制,则将生成链接器错误。 本质上,这是boost :: nocopyable所具有的效果,只是您没有为这样一个简单而琐碎的任务引入外部库。

编辑:同样,如果将构造函数和运算符设为私有,则会收到编译器错误。

您绝对不应这样做:

 class DFoo
 {
     Foo& operator=(const Foo& rhs) ;
 };

除非您明确希望支持将基类分配给派生类型(不太可能)。
Assignemtn运算符应如下所示:

 class DFoo
 {
     DFoo& operator=(DFoo const& rhs);  // You can only assign DFoo to a DFoo.
                                        // Now there is no way for DFoo1 to get assigned to a DFoo
 };

同样在这个简单的示例中,您发布了由编译器生成的默认赋值运算符应该可以按预期工作。 您写赋值运算符有什么特殊原因吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM