繁体   English   中英

当专门化基本模板类时,C ++保持对(函数参数的)受保护成员的访问

[英]C++ keeping access to protected member (of the function argument) when specializing base template class

任何人都可以帮助解决此问题(该问题在GCC和VC ++中均持续存在)。

template <class T> class A{  
protected:  
    T a;  
public:  
    A(int aa=0){a=aa;}  
    virtual ~A(){}  
    virtual void plus(A const *AA){a=a+AA.a;}  
};  

class B:public A<int>{  
public:     
    B(int bb=0):A<int>(bb){}  
    virtual ~B(){}  
    void plus(A<int> const *AA){a=a+AA->a;} //<--PROBLEM: I can access a but not AA->A?  
};  

这是预料之中的。

B的实例无权戳入任意 A的内部; 它仅有权访问(其他)B的A部分。 这就是protected关键字的含义。

这不是编译器的问题,而是标准的一致行为。 您只能通过this (隐式或显式)访问基类的受保护成员。

看起来应该像这样:

class B:public A<int>{  
public:     
    B(int bb=0):A<int>(bb){}  
    virtual ~B(){}  
    void plus(A<int> const *AA){this->A::plus(AA);}
};

如果这样做,则无需在派生类中重新实现plus函数。

“ UncleBens”已经回答了您的主要问题,但有一些详细信息...

第一:

virtual void plus(A const *AA){a=a+AA.a;}  

由于AA是一个指针,因此您无法执行AA.a ... ;-)

其次,请注意,成员指针通常不尊重可访问性。 仅使用隐式转换,您就可以访问基类的受保护内容。 成员指针的可访问性与流控制的goto几乎相同。

干杯,……

–阿尔夫

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM