假设我有以下抽象类Foo
和Bar
:
class Foo;
class Bar;
class Foo
{
public:
virtual Bar* bar() = 0;
};
class Bar
{
public:
virtual Foo* foo() = 0;
};
进一步假设我有派生类
ConcreteFoo
和ConcreteBar
。我想协方差地改进foo()
和bar()
方法的返回类型,如下所示:class ConcreteFoo : public Foo
{
public:
ConcreteBar* bar();
};
class ConcreteBar : public Bar
{
public:
ConcreteFoo* foo();
};
由于我们心爱的单遍编译器不知道
ConcreteBar
将继承自Bar
,因此不会编译,因此ConcreteBar
是完全合法的协变量返回类型。普通向前声明ConcreteBar
也不起作用,因为它不告诉编译器有关继承的任何信息。这是我必须忍受的C++的缺点,还是实际上有解决此难题的方法?
最佳答案
您可以很容易地伪造它,但是会丢失静态类型检查。如果将dynamic_casts
替换为static_casts
,则您具有编译器在内部使用的内容,但是没有动态或静态类型检查:
class Foo;
class Bar;
class Foo
{
public:
Bar* bar();
protected:
virtual Bar* doBar();
};
class Bar;
{
public:
Foo* foo();
public:
virtual Foo* doFoo();
};
inline Bar* Foo::bar() { return doBar(); }
inline Foo* Bar::foo() { return doFoo(); }
class ConcreteFoo;
class ConcreteBar;
class ConcreteFoo : public Foo
{
public:
ConcreteBar* bar();
protected:
Bar* doBar();
};
class ConcreteBar : public Bar
{
public:
ConcreteFoo* foo();
public:
Foo* doFoo();
};
inline ConcreteBar* ConcreteFoo::bar() { return &dynamic_cast<ConcreteBar&>(*doBar()); }
inline ConcreteFoo* ConcreteBar::foo() { return &dynamic_cast<ConcreteFoo&>(*doFoo()); }
关于c++ - 有没有办法向前声明协方差?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1259272/