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