簡體   English   中英

基類構造函數對派生類C ++不可見

[英]Base class constructor not visible to derived class C++

我正在用C ++編寫玩具正則表達式引擎作為學習練習,我遇到了編譯器錯誤。 這是實現不同表達式子類型的類的定義:

// ***************************************************************
// ***************************************************************

  class RegexExpression {
  public:

    virtual RegexResult match(std::string);
  };

// ***************************************************************

  class RegexTerm : public virtual RegexExpression {
  public:
    RegexTerm(char c) : _matchChar(c) {}

    RegexResult match(std::string);

  private:

    char _matchChar;
  };

// ***************************************************************

  class RegexNil : public virtual RegexExpression {

  public:

    RegexResult match(std::string);

  };

// ***************************************************************
// ***************************************************************

  class RegexBinaryExpression : public virtual RegexExpression {
  public:
    RegexBinaryExpression
    (RegexExpression &lhs, RegexExpression &rhs) :
      _lhs(lhs), _rhs(rhs) {}

  protected:

    RegexExpression _lhs;
    RegexExpression _rhs;


  };

// ***************************************************************

  class RegexOr : public RegexBinaryExpression {
  public:

    RegexResult match(std::string);

  };

// ***************************************************************

  class RegexAnd : public RegexBinaryExpression {
  public:

    RegexResult match(std::string);

  };

但是,當我嘗試實例化RegexOr時,例如:

RegexOr regex(RegexTerm('a'), RegexNil());

然后我收到編譯器錯誤,告訴我RegexBinaryExpression的2參數構造函數不可見。

如果我在RegexOr中顯式定義構造函數,例如:

RegexOr(RegexExpression &l, RegexExpression &r) : RegexBinaryExpression(l, r) {}

然后我被告知RegexNil無法轉換為RegexExpression。

我在這做錯了什么?

至少在C ++ 11之前,你必須自己在RegexOr實現構造RegexOr 但是,您將其實現為采用非const引用參數,然后您嘗試從臨時綁定,該語言禁止該臨時參數。

而是通過const引用(或者甚至可能通過值)獲取參數:

RegexBinaryExpression(const RegexExpression &lhs, const RegexExpression &rhs)
: _lhs(lhs)
, _rhs(rhs)
{}

RegexOr(const RegexExpression &l, const RegexExpression &r) : RegexBinaryExpression(l, r) {}

您不能將臨時對象傳遞給非const引用參數。 要使其編譯,您需要將參數更改為const引用(或按值)。

但是你有一個更大的問題。 將參數復制到RegexBinaryExpression的成員時,它們將存儲為RegexExpression對象而不是派生對象。 有關派生類型的信息將丟失。 這稱為對象切片。

您將需要動態分配正則表達式對象並在類中存儲指向它們的指針。 我會推薦智能指針。 您還可以將類型的正則表達式對象存儲在類,模板參數中,而不是存儲在繼承層次結構中。 這可能更難實現並且有一些缺點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM