2010-11-11 128 views
1

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

请帮助 谢谢

回答

6

是。

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

+2

你不需要做出基类虚拟。虚拟基类功能允许您正确使用多态。通常情况下,您可以重写基类函数,但假设您有一组“形状”对象指针,则可以将该数组的元素实例化为派生对象,如“方形”或“三角形”像draw()它通常会调用基类的绘制,除非它是虚拟的,那么它将查看数组实际指向的是什么类型,并调用派生类的函数 – thecoshman 2010-11-11 17:27:19

+1

@thecoshman:他要求等价于C#的'override'关键字(多态),而不是C#的'new'关键字(隐藏)。为此,你需要'虚拟'。 (即使他不明白这个区别) – SLaks 2010-11-11 17:49:34

+0

好吧,如果你仔细看看C#中的关键字'override',它在C++中是不需要的,它隐含地暗示了这两个函数具有相同的签名。 – thecoshman 2010-11-11 17:57:59

0

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

+0

它不会被_fully_动态;重载(参数类型)将在编译时被选中。 – SLaks 2010-11-11 17:22:06

+0

Slaks:真正的dat。 – 2010-11-11 17:36:32

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*类(或T2&)和T2从T1衍生那么它的行,它仍然是过度的,而不是隐藏。 HTH

0

很多答案都说你做了一个基类函数virtual,这通常是完成但不需要的。你可以只执行下列操作...

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

如果你有一个指针如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; 
} 

=0foo()末意味着该函数是纯虚函数,这意味着它必须由一个派生类中定义的,您不能做一个A的实例。一个很好的例子是你会在游戏中使用它,你可能有一个基类GameToken,它有一个XYZ位置和一个纯虚函数的绘制和更新。从这个你可以得到playerAIdynamicObject等...您的发动机则可以只存储GameToken*类型的一个阵列,通过这个阵列,呼吁所有不同类型的数组中draw()update()迭代

+0

'虚拟'是需要的,因为C#*中的覆盖*表示*多态 – 2010-11-11 18:18:24