是否可以在C ++中覆盖基类方法,就像我们可以在C#中使用override关键字一样?
请帮助 谢谢
答案 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()
表示数组中的所有不同类型