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

时间:2010-10-07 17:14:01

标签: c++

任何人都可以帮忙解决这个问题(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?  
};  

4 个答案:

答案 0 :(得分:3)

这是可以预期的。

B的一个实例在任意 A的内部没有任何权利;它只有权访问(其他)B的A部分。这就是受保护的关键字的含义。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这应该是:

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函数。

答案 3 :(得分:0)

“UncleBens”已经回答了你的主要问题,但有些细节......

首先:

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

由于AA是一个指针,你无法做AA.a ...; - )

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

干杯&amp;第h。,

- Alf