繁体   English   中英

C ++:如何在协变返回类型中重用代码?

[英]C++: how to reuse code in covariant return types?

我有以下简单的课程

class base
{
public:
  int x;
  base &set(int y)
    {
      x = y;
      return *this;
    }
};

并希望创建一个具有附加功能的新产品,例如打印值x。 所以我做:

class derived : public base
{
public:
  void print()
    {
      cout << x << endl;
    }
};

现在在主程序中,我想做类似的事情

D.set(2).print();

但是为此,编译器抱怨类库没有名为“ print”的成员。

如果我尝试使用协变返回类型并将两个类写为

class base
{
public:
  int x;
  virtual base &set(int y)
    {
      x = y;
      return *this;
    }
};

class derived : public base
{
public:
  derived &set(int y)
    {
      x = y;
      return *this;
    }
  void print()
    {
      cout << x << endl;
    }
};

那么该语句就可以正常工作,但是我不得不在两个类中为“ set”重写完全相同的函数体,即使唯一改变的是返回类型。

如果以后需要更改base :: set的功能,那么我将必须遍历所有派生类以更改“ set”功能...有什么方法可以避免这种情况? 提前致谢!

根据您的情况,您可能可以使用CRTP

template <class D>
class base {
    D& set(int x) {
        …;
        return *static_cast<D*>(this);
    }
};

class derived : base<derived> { … };

C ++就像您说的那样工作,并且您在基类set返回base& ,所以C ++就是这样做的。 但是为了解决这个问题,您有很多方法。

首先,您不必强制使函数virtual以在派生类中重写它(请注意,虚拟调用的速度比普通调用慢一些)。

其次,您可以将基类实现称为base::set因此代码如下:

class base {
    ...
    base& set( int x ) {...}
};
class derived : public base {
    derived& set( int x ) {
        return static_cast<derived&>( base::set(x) );
    }
};

暂无
暂无

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

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