簡體   English   中英

C ++派生的模板類:實例的受訪問保護的成員

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

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