覆盖基类方法

时间:2010-11-11 17:16:41

标签: c# c++

是否可以在C ++中覆盖基类方法,就像我们可以在C#中使用override关键字一样?

请帮助 谢谢

4 个答案:

答案 0 :(得分:6)

只需制作基本方法virtual C ++没有override个关键字;具有相同签名的任何方法(包括参数类型和const - ness)作为virtual基本方法将覆盖它。

答案 1 :(得分:3)

仅在C ++ 0x中,即将出现的C ++语言标准。在C ++ 03中,这是您隐式覆盖的当前C ++,也就是说您没有明确地将覆盖方法标记为覆盖方法。但要小心,如果你不小心写了另一个签名但名字相同,基类功能将被隐藏而不是覆盖!

struct X
{
   virtual void f()  {...};
};

struct Y:X
{
   void f() {...} //overrides X::f
};

struct Z:X
{
   void f() const  {... } //hides X::f!!!
};

函数声明中唯一不同的是,如果在基类中函数返回T1*(或T1&)并在派生类T2*(或{{1然后T2来自T1,然后它就可以了,它仍然是过度的,而不是隐藏的。 HTH

答案 2 :(得分:0)

是的,您可以覆盖基类方法;如果在基类中使用关键字virtual,则该方法的绑定将是动态的(即完全多态);如果您不在基类中使用关键字virtual,则该方法的绑定将是静态的。

答案 3 :(得分:0)

很多答案都说你创建了基类函数virtual,这通常已经完成但不需要。你可以做以下......

class A{
public:
void foo();
}
class B: public A{
public:
void foo();
}
class C: public A{
public:
void foo();
}

如果您有一个A指针数组,例如A* basePTR[2],您可以将basePTR[0]实例B,然后basePTR[1]作为C的实例。但如果您尝试拨打basePTR[0]->foo(),则会拨打A::foo()

如果您将A定义为

class A{
public:
virtual void foo();
}

然后调用basePTR[0]->foo()将调用B::foo()

它们是使用此功能的开销,因为在运行时必须查找是否要调用基函数foo()或派生类的foo()但通常,此功能是值得相对较小的表现。

您可以将A定义为

class A{
public:
virtual void foo() =0;
}

=0末尾的foo()表示此函数是纯虚函数,这意味着它必须由派生类定义,并且您不能创建{的实例{1}}。你可以在游戏中使用它的一个很好的例子,你可能有一个具有XYZ位置和纯虚函数绘制和更新的基类GameToken。从中您可以得到A player AI等等......您的引擎可以只存储一个类型为dynamicObject的数组,并遍历此数组调用GameToken*draw()表示数组中的所有不同类型