gpt4 book ai didi

c++ - "Overloading"具有不同参数集的纯虚函数

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

考虑以下代码示例

#include <iostream>
using namespace std;

class Color
{
public:
virtual void mixColors(Color &anotherColor) = 0;
};

class RGB : public Color
{
public:
void mixColors(RGB &anotherColor);
};

void RGB::mixColors(RGB &kol)
{
return RGB(0xABCDEF);
}

我完全知道为什么这段代码不起作用(RGB 中的mixColors() 没有实现纯虚函数,因为它有不同的参数集)。但是我想问一下是否有另一种方法可以解决这个问题。假设我想混合颜色,但对不同的颜色类别使用不同的算法。如果有任何帮助,我将不胜感激。

最佳答案

在继承需要子类型的语言中,例如 C++,您不能在派生类中使成员函数参数“更具体”。 (至少不是没有 breaking type safety 。)要获得完整的技术解释,see here .

要更具体地理解这一点,请注意,在您的 Color 类中,您正在断言具有签名的成员函数的存在:

virtual void mixColors(Color &anotherColor) = 0;

这意味着任何颜色可以与任何其他颜色混合(不一定是同一类),并且这个混合过程的具体实现只取决于第一种颜色的类别。这是完全错误的。

解决问题的最简单方法是简单地使用函数重载:

// I am assuming RGB and CMYK are cheap to pass by value, which seems reasonable.
// If this is not true, you can always pass them by const reference.

RGB mix_colors(RGB rgb1, RGB rgb2) { ... }

CMYK mix_colors(CMYK cmyk1, CMYK cmyk2) { ... }

或者,假设您真的想改变其中一种颜色,而不是生成新的颜色对象:

class RGB
{
// ...
public:
RGB & mix_colors(RGB); // return *this at the end
};

class CMYK
{
// ...
public:
CMYK & mix_colors(CMYK); // return *this at the end
};

然而,使用重载而不是虚成员函数有一个缺点:重载必须在编译时解决,而虚成员函数可以动态调度。可悲的是,如果您需要对要混合的颜色执行运行时分派(dispatch),您就有点搞砸了,因为 C++ 没有像 Haskell 的 type classes 那样的东西。或 Common Lisp 的 multi methods .您可以使用 visitor pattern 对多个分派(dispatch)进行编码,但这绝对不漂亮。

关于c++ - "Overloading"具有不同参数集的纯虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23955177/

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