У меня есть абстрактный виртуальный базовый класс Foo, из которого я получаю множество других классов, которые немного отличаются. У меня есть фабрика, которая создает производные классы и возвращает Foo*. Одна из моих больших проблем заключается в перегрузках операторов, мне нужно убедиться, что DFoo не управляется DFoo1 (не показано). В настоящее время я справлялся с этим, проверяя, не сбой ли приведения, но я очень недоволен таким подходом. Я должен использовать базовую реализацию, потому что я могу вернуть только базовый класс с завода. Если это лучший способ сделать это, все в порядке, я просто хочу убедиться, что это имеет смысл и что нет шаблона, который я упускаю. Любые предложения о том, как обращаться с такими вещами, очень ценятся.
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);
}
}
}
dynamic_cast
иDFoo &
вместо того, что вы написали. - person Nick Meyer   schedule 07.01.2010if(temp != NULL)
? temp не является указателем, а если бы и был, то исходит из ссылки и не может быть NULL. - person Potatoswatter   schedule 07.01.2010