假设我有以下抽象类FooBar:

class Foo;
class Bar;

class Foo
{
public:
  virtual Bar* bar() = 0;
};

class Bar
{
public:
  virtual Foo* foo() = 0;
};

进一步假设我有派生类ConcreteFooConcreteBar。我想协方差地改进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/

10-11 21:00