簡體   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