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;
},
你的f是成员函数,而main是外部函数,两者完全不同]
但是在main函数中就不能访问了,如果想访问需要把protected换成public, v是保护成员(protected),保护成员的定义就是可以在派生类中访问,但不能在类外访问。而私有成员(private)是派生类和类外都不能访问, 我这里访问的是 给 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;
},
你的f是成员函数,而main是外部函数,两者完全不同]
但是在main函数中就不能访问了,如果想访问需要把protected换成public, v是保护成员(protected),保护成员的定义就是可以在派生类中访问,但不能在类外访问。而私有成员(private)是派生类和类外都不能访问, 我这里访问的是 给 f 函数传进来的 B 类型 参数啊 , 是通过形参点出来的并不是直接访问的,我觉得这跟我在main函数里面定义一个B 类型,在通过点访问一样的
void f(B &ca)
{
ca.v = 5;
}
void main()
{
B b;
b.v;
},
你的f是成员函数,而main是外部函数,两者完全不同]