gpt4 book ai didi

c++ - 重载纯虚拟运算符

转载 作者:搜寻专家 更新时间:2023-10-31 00:50:57 26 4
gpt4 key购买 nike

我有抽象类 Number 和 4 个纯虚拟运算符 (+,-,/,*)。我想制作两个派生类 IntegerReal 并在那里覆盖这些运算符。我不太了解如何声明运算符。我没有在网上找到任何与我的情况相似的例子。

我的问题是:在抽象基类 Number 中,我的运算符必须返回引用 Number& 或指针 Number*,因为我无法返回抽象类本身。但是我应该传递什么作为参数呢? Number&Number* 也是,但是我需要在类中存储数字,我的基类中是否应该有类似 void* num 的东西?让我们想象一下,我有

class Number {
...
virtual Number& operator+(const Number&) = 0;
};

我应该如何在派生类 Integer 中覆盖此运算符?

最佳答案

I know, but my tutor insist on doing it as overriding pure virtual operator as exercising in abstract classes, but I really don't get it.

好吧,你可以从中学到两件事:

  1. 虚函数的一般工作原理(自定义运算符与普通函数无异,只是调用语法不同)。
  2. 虚函数不是解决任何问题的 chalice 。

问题是类 IntegerReal 很可能有不同的内部表示——所以你不能做加法/乘法/...不知道您作为第二个操作数收到的具体类型。此外,还不清楚混合操作数类型的返回类型应该是什么。

I don't really need atm to add real+int only real+real, int+int

好吧,我们可以捕捉到这个:

class Number
{
public:
virtual ~Number() { } // in any case, a virtual base class should have a virtual destructor!

// fine so far:
virtual Number& operator+(Number const&) const = 0;
// we are not going to change the ^
// own instance, so we'd rather have this operator const
// (in contrast to operator+=)
};

class Integer : public Number
{
public:
Integer& operator+(Number const& other) const override
// ^ co-variant return type, so that's fine
{
// at very first, we make sure that we actually received
// an instance of type Integer
auto o = dynamic_cast<Integer const*>(&other);
if(!o)
// if not, throwing an exception is a good candidate
// for error handling...
throw std::invalid_argument("argument must be of type Integer");

// now as we know it IS an Integer:
return Integer(this->value + o->value); // or whatever...
// OOPS - the returned object gets lost when the function is left...
}
};

如果您也希望能够添加 Real,那么您需要进行另一种类型转换。假设 Integer + Real 结果为 Real,那么您必须将返回类型改回 Number

但是,仍然存在一个很大的问题:一旦函数离开,返回的对象就会被销毁,因此返回的引用是悬空的。

我们必须通过某种方式解决这个问题。但是引用并不合适,因此我们可能会选择智能指针:

class Number
{
virtual std::unique_ptr<Number> operator+(Number const&) const = 0;
};

class Integer : public Number
{
std::unique_ptr<Number> operator+(Number const& other) const override
// ^
// unfortunately, now, as ordinary struct, no co-variance possible any more
{
return std::make_unique<Integer>(this->value + o->value);
}
};

这个问题再次说明了实际选择的方法是多么不合适......

关于c++ - 重载纯虚拟运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56476559/

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