gpt4 book ai didi

C++虚函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:46 25 4
gpt4 key购买 nike

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

Class Base
{
virtual void Draw()
{
//something...
}
};

然后我会有一个像这样的 Base 数组:

Base Array[255];

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

现在或者,如果我确切地知道我会制作什么衍生品,它可以像这样完成

class Base
{
int ID;
};

然后是像以前一样的 Base 数组:基数组[255];

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

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

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

现在,这个解决方案当然不允许我只遍历数组并为每个对象调用 Draw。相反,它必须做这样的事情。

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();
}

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

还有其他需要考虑的事情吗? (也许是代码简洁,但我更喜欢在代码中展示我的类类型,所以我不会被转换打扰。

最佳答案

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

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

Base *Array[255];

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

关于C++虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3376086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com