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

C++ derived template class: Access protected member of an instance

本文关键字:实例 受保护 成员 访问 派生 C++      更新时间:2023-10-16

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

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