[英]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.