[英]Why base class = new derived class cannot call derived class method?
我们有两个类 A 和 B,B 派生自 A,我创建了A a = new B();
为什么在我的代码中调用不包含 AI 的 B 方法时会出错。 这是否意味着 Type Object Pointer 是 A 类型? 其次,为什么当我调用SomeMethod
它调用 A 而不是 B 的方法?
在堆这种情况下创建对象实例时,类型对象指针指向A还是B?
class A
{
public void SomeMethod()
{
Console.Write("This is A");
}
}
class B : A
{
public void SomeMethod()
{
Console.Write("This is B");
}
public void OtherMethod()
{
Console.Write("This is New method");
}
}
class Program
{
static void Main(string[] args)
{
A a = new B();
a.SomeMethod(); // This is A method
a.OtherMethod(); // I get error here that a does not contain definition for this method
}
}
因为您错过了 IDE 中的明显警告
严重性代码描述项目文件行抑制状态警告 CS0108“B.SomeMethod()”隐藏继承的成员“A.SomeMethod()”。 如果打算隐藏,请使用 new 关键字。
“member1”隐藏继承的成员“member2”。 如果打算隐藏,请使用 new 关键字。
变量被声明为与基类中的变量同名。 但是,没有使用 new 关键字。 此警告通知您应该使用 new; 变量的声明就像在声明中使用了 new 一样。
如果要隐藏它,请使用new
关键字
但是,如果您想调用它,请使用virtual
并override
它,或者只是更改方法名称,这样您就不会隐藏它
class A
{
public virtual void SomeMethod()
{
Console.Write("This is A");
}
}
class B : A
{
public override void SomeMethod()
{
base.SomeMethod();
Console.Write("This is B");
}
public void OtherMethod()
{
Console.Write("This is New method");
}
}
virtual 关键字用于修改方法、属性、索引器或事件声明,并允许在派生类中覆盖它们。 例如,此方法可以被任何继承它的类覆盖:
需要覆盖修饰符来扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现。
在堆这种情况下创建对象实例时,类型对象指针指向A还是B?
您不必担心堆上发生的事情(这些是实现细节),只需担心语言允许您做什么。
但是,A 在技术上不存在,只有 B 的一个实例,它具有 A 的所有实现(如果需要)
您必须指定要覆盖虚拟功能。 尝试这个:
class A
{
public virtual void SomeMethod()
{
Console.Write("This is A");
}
}
class B : A
{
public override void SomeMethod()
{
Console.Write("This is B");
}
public void OtherMethod()
{
Console.Write("This is New method");
}
}
要访问当前失败的其他方法,您需要告诉您的A
像B
一样行事。
改变
a.OtherMethod();
到
(a as B).OtherMethod();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.