C ++派生的模板类:访问受保护的实例成员

时间:2013-09-12 17:52:02

标签: c++ templates friend derived

我有一个模板基类和一个派生模板类。派生的方法有一个带有参数的重载方法,该方法保存对同类基类的对象的引用。如果这些不是模板类,我会使派生类成为基类的朋友,以便在这种情况下我可以访问基类的受保护成员,但是如何使用模板执行此操作?

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;
}

1 个答案:

答案 0 :(得分: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); as proposed by Igor Tandetnik。无需使用friend