困扰好久了,赶高手就我!关于C#子类访问父类protected 成员。

namespace 类的继承和访问成员

{
class vehicle//定义汽车vehicle
{
public int wheels;
protected float weight;
public void f()
{
wheels = 4;
weight = 10;
}
}
}
class train
{
public int num;
private int passengers;
private float weight;
public void f()
{
num = 5;
weight = 100;
vehicle v1 = new vehicle();
Console.WriteLine ( v1.wheels);
v1.wheels = 4;
// v1.weight = 6;//重写!//错误 1 “类的继承和访问成员.vehicle.weight”不可访问,因为它受保护级别限制
weight = 6;//private 成员只能被所在的类中方法访问,其他不可。。。。
}

}
class car : vehicle
{
int passengers;
public void f()//覆盖!!!!!!!!!//警告:“类的继承和访问成员.car.f()”隐藏了继承的成员“类的继承和访问成员.vehicle.f()”。
{
vehicle v1 = new vehicle();
Console.WriteLine(v1.wheels);
Console.WriteLine(v1.weight);//错误!!!!!!!!!!!!!!!!!11
Console.WriteLine(weight);//正确
Console.WriteLine(this.weight);//正确
Console.WriteLine(base.weight);//正确
}
}
class Program
{
static void Main(string[] args)
{
上面中 Console.WriteLine(v1.weight);//错误!!!!!!!!!!!!!!!!!为什么??????????是子类访问父类protected 成员啊?

第1个回答  2013-11-21
http://msdn.microsoft.com/zh-cn/library/s9zta243.aspx

无法通过类型“type1”的限定符访问保护成员“member”;限定符必须是类型“type2”(或者从该类型派生的)
派生的类无法通过基类的实例来访问其基类的受保护成员。 在派生的类中声明的基类的实例在运行时可能是另一个类型的实例,该类型从相同的基派生但与派生的类无关。 由于受保护成员只可由派生的类型访问,因此要访问可能在运行时无效的受保护成员的任何尝试都会由编译器标记为无效。

再结合你的代码,你的代码看似是声明了个vehicle,但如果你这样写呢?
vehicle v1 = new vehicle();
train t=new train();
v1=t;
v1.weight //此时你认为访问到的是vehicle的还是train的,v1现在是train,car不派生自train,因此不能访问。我没有改动你的代码,只是添加了额外的一句,造成了不能访问。而编译器按照最保险的原则报错。追问

这块儿没看懂,"而编译器按照最保险的原则报错。"???什么意思??怎么说明了这一点????

追答

也就是说按理说你的代码是应该可以访问的,但我的代码是不可访问的。但是我的代码只是在你的代码的基础上加了一句v1=t;就造成了出错。编译器报错的原则是有可能出错就报错,如果编译不报错,那如果你加了我的那句代码,就还是会运行报错。

本回答被网友采纳
第2个回答  2013-11-21
定义好的类都没有实例化

继承关系中子类是跟父类重名的方法子类是会覆盖掉父类的

类train压根就没有继承父类就算你在类中new 了车的类但是它的weight的字段是protect修饰符只供继承它的子类访问,而wheels 字段是是public所以可以赋值
第3个回答  2013-11-22
class car 继承了 vehicle以后 this.weight 可以访问。这叫继承。。。
或者 ((vehicle)this).weight 也可以。
你在哪new那也叫实例化,跟继承没半毛钱关系。本回答被提问者采纳
相似回答