普通派生类中的成员函数模板,访问基类的保护成员的权限有关问题
普通派生类中的成员函数模板,访问基类的保护成员的权限问题
下面具体说明下无的疑问:
我首先声明一个基类A:
class A
{
public:
A(int vn,char vc){n=vn;c=vc;}
// protected:
int n;
char c;
};
再派生了一个类B
class B : public A
{
public:
B(int vn,char vc):A(vn,vc){}
template <typename T> T get(T var){return var;}
};
用类B中的成员函数模板访问数据成员。
int main()
{
B t(1,'m');
cout<<t.get(t.n)<<endl;
cout<<t.get(t.c)<<endl;
return 0;
}
在A类中,如果不注释掉ptoteted这一行,编译提示关键词:‘char A::c’ is protected
如果注释掉,编译通过,运行正常。
这是否所说,成员函数模板不能访问公共继承下来的保护成员?按派生类的普通成员函数的规则,是应该可以访问保护成员的,为什么成员函数是函数模板就不行了?
------解决方案--------------------
好像理解错了吧~~
你穿的参数 又不是 类内部,
类的外部当然 对 protected 不可见了
------解决方案--------------------
模板这样写:
template <typename T> char get(T var){return var.c;}
这样调用:t.get(t)
你注意一下:
char c; 是保护的,在外部是不可访问的,也就是不能访问 t.c 的。
你这个例子没必要 用模板。
下面具体说明下无的疑问:
我首先声明一个基类A:
class A
{
public:
A(int vn,char vc){n=vn;c=vc;}
// protected:
int n;
char c;
};
再派生了一个类B
class B : public A
{
public:
B(int vn,char vc):A(vn,vc){}
template <typename T> T get(T var){return var;}
};
用类B中的成员函数模板访问数据成员。
int main()
{
B t(1,'m');
cout<<t.get(t.n)<<endl;
cout<<t.get(t.c)<<endl;
return 0;
}
在A类中,如果不注释掉ptoteted这一行,编译提示关键词:‘char A::c’ is protected
如果注释掉,编译通过,运行正常。
这是否所说,成员函数模板不能访问公共继承下来的保护成员?按派生类的普通成员函数的规则,是应该可以访问保护成员的,为什么成员函数是函数模板就不行了?
------解决方案--------------------
好像理解错了吧~~
你穿的参数 又不是 类内部,
类的外部当然 对 protected 不可见了
------解决方案--------------------
模板这样写:
template <typename T> char get(T var){return var.c;}
这样调用:t.get(t)
你注意一下:
char c; 是保护的,在外部是不可访问的,也就是不能访问 t.c 的。
你这个例子没必要 用模板。