[英]C++ derived template class: Access protected member of an instance
我有一個模板基類和一個派生模板類。 派生的方法有一個帶有參數的重載方法,該參數保存對基類相同類型的對象的引用。 如果這些不是模板類,則可以將派生類作為基類的朋友,以便在這種情況下可以訪問基類的受保護成員,但是如何使用模板呢?
template <typename T>
class base
{
// If this wasn't a template class, I would have done this:
// friend class derived;
public:
base(T val)
: val_(val)
{
}
virtual void assign(const base<T>& other)
{
val_ = other.val_;
}
protected:
T val_;
};
template <typename T>
class derived : public base<T>
{
public:
derived(T val)
: base<T>(val)
{
}
virtual void assign(const base<T>& other)
{
this->val_ = other.val_; // error: ‘int base<int>::val_’ is protected
}
};
int main()
{
derived<int> a(5);
derived<int> b(6);
b.assign(a);
return 0;
}
為什么要virtual
? 在您的示例中derived::assign()
與base::assign()
。
class base
{
...
public:
...
void assign(const base<T>& other)
...
}
derived<int> b(6); b.assign(a); //calls base<int>::assign(..)
如果derived
應在assign(..)
做更多工作,請使用base<T>::assign(other);
根據Igor Tandetnik的建議 。 無需使用friend
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.