在基类强制转换后使用派生类中的方法

时间:2013-10-03 15:52:20

标签: class

在将其强制转换为派生类后,如何使用派生类的方法。

public class BaseClass
{
  public virtual void DoSomething()
  {
    Trace.Write("base class");
   }
}

public class DerivedClass : BaseClass
{
  public override void DoSomethingElse()
  {
    Trace.Write("derived class");
  }
}

我希望能够致电

BaseClass B ( (BaseClass*) new DerivedClass());
B.DoSomethingElse();

我出于不同的原因需要B cast作为BaseClass ...我可以立即获得名为C的派生类,然后将其转换为BaseClass并对同一时刻有两个不同的引用吗?

1 个答案:

答案 0 :(得分:2)

看起来你正在使用C#,但无论如何都是一样的想法。您必须将对象强制转换为所需方法所在的类型。考虑(以下是C ++):

BaseClass* b = new DerivedClass( );
b->DoSomethingElse( ); // fails because this method doesn't exist for BaseClass
((DerivedClass*)b)->DoSomethingElse( ); // works because it's cast to the correct type

C#示例:

BaseClass b = new DerivedClass( );
b.DoSomethingElse( ); // fails because this method doesn't exist for BaseClass
(b as DerivedClass).DoSomethingElse( ); // works because it's cast to the correct type

对于您的详细信息,您可以将其转换为另一种类型并将其分配给不同的局部变量,以便将相同的实例视为两种不同的类型。因此,您可以为对象指定一个(类型为BaseClass的指针),并为对象指定另一个指针(类型为DerivedClass)。这完全有效。考虑:

C ++:

BaseClass* b;
DerivedClass* c;
b = c = new DerivedClass( );
c->DoSomethingElse( ); // totally works

C#:

BaseClass b;
DerivedClass c;
b = c = new DerivedClass( );
c.DoSomethingElse( ); // totally works

[编辑]:如果你正在使用C ++ / CLI,只需用帽子(^)替换星号(*)。