覆盖基类方法
回答
是。
只要使基本方法virtual
。
C++没有override
关键字;任何具有相同签名(包括参数类型和const
-度)的方法都将作为基本方法virtual
将覆盖它。
是的,你可以重写基类方法;如果在基类中使用关键字virtual
,则该方法的绑定将是动态的(即完全多态);如果您在基类中未使用关键字virtual
,则该方法的绑定将是静态的。
它不会被_fully_动态;重载(参数类型)将在编译时被选中。 – SLaks 2010-11-11 17:22:06
Slaks:真正的dat。 – 2010-11-11 17:36:32
只有在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
很多答案都说你做了一个基类函数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;
}
的=0
在foo()
末意味着该函数是纯虚函数,这意味着它必须由一个派生类中定义的,您不能做一个A
的实例。一个很好的例子是你会在游戏中使用它,你可能有一个基类GameToken,它有一个XYZ位置和一个纯虚函数的绘制和更新。从这个你可以得到player
AI
dynamicObject
等...您的发动机则可以只存储GameToken*
类型的一个阵列,通过这个阵列,呼吁所有不同类型的数组中draw()
和update()
迭代
'虚拟'是需要的,因为C#*中的覆盖*表示*多态 – 2010-11-11 18:18:24
- 1. 调用覆盖方法,超类调用覆盖方法
- 2. 如何覆盖类方法
- 3. 覆盖方法
- 4. 覆盖方法
- 5. 覆盖'+'方法
- 6. 覆盖方法
- 7. 覆盖方法
- 8. 覆盖Child类中的ParentModel类方法
- 9. Objective C - 覆盖基类的方法 - 如何调用子类的方法?
- 10. Java方法覆盖 - “方法不会覆盖超级方法...”
- 11. 从基类覆盖函数
- 12. 无法覆盖LocationListener类的方法
- 13. 覆盖派生类中已覆盖的方法
- 14. c#用基本类型的词典覆盖方法
- 15. 在派生类上实现接口或覆盖基本方法
- 16. 当覆盖vs隐藏基类方法时C#范围差异
- 17. Android方法覆盖
- 18. Java。覆盖方法
- 19. C++覆盖方法
- 20. eclipse覆盖方法
- 21. C++方法覆盖
- 22. Backbone.Marionette覆盖方法
- 23. 覆盖OnCreateOptionsMenu方法
- 24. 从指定的类覆盖方法
- 25. 使用Groovy元类覆盖方法
- 26. 可以覆盖类别方法吗? IOS
- 27. JavaScript子类化和方法覆盖
- 28. 如何覆盖luabind类__finalize方法?
- 29. python中覆盖类的方法
- 30. 如何覆盖子类中的方法?
你不需要做出基类虚拟。虚拟基类功能允许您正确使用多态。通常情况下,您可以重写基类函数,但假设您有一组“形状”对象指针,则可以将该数组的元素实例化为派生对象,如“方形”或“三角形”像draw()它通常会调用基类的绘制,除非它是虚拟的,那么它将查看数组实际指向的是什么类型,并调用派生类的函数 – thecoshman 2010-11-11 17:27:19
@thecoshman:他要求等价于C#的'override'关键字(多态),而不是C#的'new'关键字(隐藏)。为此,你需要'虚拟'。 (即使他不明白这个区别) – SLaks 2010-11-11 17:49:34
好吧,如果你仔细看看C#中的关键字'override',它在C++中是不需要的,它隐含地暗示了这两个函数具有相同的签名。 – thecoshman 2010-11-11 17:57:59