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
。
相关文章:
- C++:无法访问声明的受保护成员
- 继承和友元函数,从基类访问受保护的成员
- 为什么派生类的好友不能使用受保护的成员?
- C++:为什么无法在派生类中访问受保护的构造函数?
- 公共/私有/受保护是否会更改内存中结构的排列?
- 在父类中公开受保护的构造函数
- 如何从其他结构访问受保护的结构变量
- 如何实现返回受保护结构的私有函数
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 从模板化父类中的派生内部类访问受保护的成员变量
- 为什么继承的受保护构造函数不能公开?
- 无法从派生类型的作用域访问另一个实例的受保护成员
- 为什么我无法使用受保护/私有继承访问派生实例中基类的受保护成员?
- 访问超类实例的受保护成员
- 为什么我无法从基类的实例访问受保护的成员?
- 为什么可以从派生实例访问基类中的受保护变量
- 继承错误 - 无法实例化抽象类 无法访问在类中声明的受保护成员
- 受保护的构造函数,使基类不可实例化
- C++派生模板类:访问实例的受保护成员
- 实现文件中的实例变量 — 私有与受保护