[英]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.