关于类成员访问权限的一个问题

时间:2022-07-14 15:16:41
class A
{
protected:
int v;
public:
A(){}
A(A & that){}
void f(int val) 
{
v = val;
}

};
class B : public A
{
public:
B(){}
B(const B &that){}
void f(B  &ca)
{
ca.v = 5;
}
};

如上面代码,为什么在B类的 f(B &ca) 函数里面可以直接访问 v 成员,在main主函数里面就不能直接用B类的对象直接访问 v 成员呢? 请指教

4 个解决方案

#1


[因为成员变量v的访问权限是protected,这种类型的访问权限允许自己的类访问,同时允许子类访问,因为类B是类A的子类,所以在B中可以直接访问v
但是在main函数中就不能访问了,如果想访问需要把protected换成public, v是保护成员(protected),保护成员的定义就是可以在派生类中访问,但不能在类外访问。而私有成员(private)是派生类和类外都不能访问, 我这里访问的是 给 f 函数传进来的 B 类型 参数啊 , 是通过形参点出来的并不是直接访问的,我觉得这跟我在main函数里面定义一个B 类型,在通过点访问一样的
 void f(B  &ca)
    {
         ca.v = 5;
    }
void main()
{
       B b;
        b.v;
},
引用 3 楼 sssunhudong 的回复:
我这里访问的是 给 f 函数传进来的 B 类型 参数啊 , 是通过形参点出来的并不是直接访问的,我觉得这跟我在main函数里面定义一个B 类型,在通过点访问一样的 void f(B  &ca)    {         ca.v = 5;    }void main(){       B b;        b.v;}


你的f是成员函数,而main是外部函数,两者完全不同]

#1


[因为成员变量v的访问权限是protected,这种类型的访问权限允许自己的类访问,同时允许子类访问,因为类B是类A的子类,所以在B中可以直接访问v
但是在main函数中就不能访问了,如果想访问需要把protected换成public, v是保护成员(protected),保护成员的定义就是可以在派生类中访问,但不能在类外访问。而私有成员(private)是派生类和类外都不能访问, 我这里访问的是 给 f 函数传进来的 B 类型 参数啊 , 是通过形参点出来的并不是直接访问的,我觉得这跟我在main函数里面定义一个B 类型,在通过点访问一样的
 void f(B  &ca)
    {
         ca.v = 5;
    }
void main()
{
       B b;
        b.v;
},
引用 3 楼 sssunhudong 的回复:
我这里访问的是 给 f 函数传进来的 B 类型 参数啊 , 是通过形参点出来的并不是直接访问的,我觉得这跟我在main函数里面定义一个B 类型,在通过点访问一样的 void f(B  &ca)    {         ca.v = 5;    }void main(){       B b;        b.v;}


你的f是成员函数,而main是外部函数,两者完全不同]