首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++虚函数

c++虚函数
EN

Stack Overflow用户
提问于 2010-07-31 07:33:56
回答 7查看 1K关注 0票数 4

只是想知道,什么会是最快的?如果我有一个像这样的基类

代码语言:javascript
复制
Class Base
{
virtual void Draw()
{
//something...
}
};

然后我会有一个Base数组,如下所示:

代码语言:javascript
复制
Base Array[255];

它可以同时包含Base和它的衍生物。例如,这将是存储各种绘图命令的一种方式。(我知道这看起来很像java,但这只是示例。只有一个函数的类没有多大意义。)

现在或者,如果我确切知道我会做什么导数,它可以这样做

代码语言:javascript
复制
class Base
{
int ID;
};

然后是一个和以前一样的基数组:基数组Array255;

然后在导数中创建绘图函数:

代码语言:javascript
复制
class Der1 : Base
{
void Draw()
{
}
};

class Der2 : Base
{
void Draw()
{
}
};

现在,这个解决方案当然不允许我在数组中循环,并为每个对象调用Draw。相反,它必须像这样做。

代码语言:javascript
复制
void CallDraw()
{
for (int i = 0; i < 255; i++)
{
switch(Array[i].ID)
{
case 1: //Der1
   ( (Der1) Array[i] ) . Draw(); 
case 2: //Der2
   ( (Der2) Array[i] ) . Draw();
}

是的,对于那些到目前为止已经读过的人来说,真正的问题。如果你知道导数,哪一个会更快?自己做一个有组织的系统,还是使用虚拟函数?

还有其他需要考虑的事情吗?(代码可能是干净的,但我更喜欢在代码中展示我的类类型,所以我不会被强制转换所困扰。

EN

回答 7

Stack Overflow用户

发布于 2010-07-31 07:36:59

一定要使用虚函数,这正是它们的作用所在。自己重新实现它很容易出错,而且肯定不会更快。

此外,在Array的声明中,您需要使用指针:

代码语言:javascript
复制
Base *Array[255];

否则,在C++ (不同于Java)中,数组只能包含Base的实例,而不能包含派生类的对象。使用指针更像是Java的引用,允许您将派生类的实例放入数组中。

票数 4
EN

Stack Overflow用户

发布于 2010-07-31 07:39:35

使用虚函数,因为从逻辑上讲,它们的工作方式几乎相同,但使用虚函数表查找可能会更慢/更快(取决于实现)。不过,除非这是代码的关键部分(也就是99 / 100的情况),否则不要为这类事情烦恼。

使用虚函数可以使您的代码更简洁、更简洁,而且您不必为您自己的C++实现相关问题而烦恼。

票数 2
EN

Stack Overflow用户

发布于 2010-07-31 07:39:39

我假设您是出于好奇心才问这个问题的--并不是因为您实际上会尝试用一个开关来实现它。

您必须将阵列设置为Base*,而不是Base

虚拟调用是数组查找和函数调用。开关通常被实现为简单的恒定时间跳跃。所以,它们都是O(1),但我认为虚拟调用会更快,因为C++编译器将进行优化,以使其更快,并且开关不能保证为O(1)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3376086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档