覆盖 C++ 中的非 void 函数,supers 返回值返回到何处

Overriding a non void function in C++, where does supers return value return to?

本文关键字:返回值 supers 返回 何处 函数 C++ void 覆盖      更新时间:2023-10-16

我正在编写一个具有三个继承级别的程序。需要我在基类中重载operator==,然后在派生类中重写该函数(不允许我更改此设计)。

该函数是一个布尔值,它对两个对象进行成员比较。如何处理超级返回值?在 Java 中获取此值很简单:我只是将覆盖函数的第一行作为对 super 的调用,例如:

retValue = super.myFunction();

我需要达到相同的结果,但C++并且操作员重载很糟糕。一些用于重载函数的伪代码将不胜感激。

我还有另一个与此有关的问题;如果在来自不同子类的实例上使用运算符,会发生什么情况?例如,sub1 和 sub2 继承自 base,哪个版本的函数将在 Main 中为以下代码行执行:

if (sub1 == sub2)

它会生成编译器错误吗?

编辑:首先,我是一名学生,所以我无法编写代码以我想要的方式完成这项任务。计划要求声明;

"车辆操作员超载:==操作员

车辆类需要重写 == 运算符。如果两个对象的所有数据字段都相等,并且它们的乘客列表相同,则两个对象相等。这需要在基类中定义,然后在派生类中重写。

我真的没有任何代码要发布,因为在阅读 Billy 的响应时,我意识到我实际上已经编写了没有类的运算符 == 函数(这不允许我覆盖它,并且不符合程序要求)。

示例;

if (sub1 == sub2)

完全是假设。我实际上会有一个车辆对象的数组,我有一个从车辆继承的汽车和飞机类,然后是一个继承自汽车的魔法校车和一个继承自飞机的Xwing。在车辆类中,我有一个int 'vType_',用于标识每个车辆实例所属的特定子类。为了防止运行时崩溃,我将简单地检查以确保对象具有相同的vType_,然后再对它们使用 == 运算符。

尽管我更喜欢编写比较函数,但我不允许这样做。我必须找到一种方法来使用基类中 operator== 函数的返回值,因为它正在比较多个数据成员,如果我在每个派生类中重写此代码,我当然会被降级。

如果我不能使用该返回值,我要么必须重写代码,要么当对象在基类的成员中具有不同的值但在派生类中具有相同的值时,我将得到错误的结果。

我将不得不将这个函数重写为 Vehicle 类的成员,但无论如何我都会发布它,希望它可能有用。每个派生类都有一些特定于这些类型的车辆的成员,以及将要比较的乘客对象数组。

相等运算符重载进行成员比较

bool operator== (Vehicle&obj1, Vehicle&obj2){ 布尔值 retValue = 假;

if (strcmp(obj1.getName(), obj2.getName()) == 0)
{
    if (obj1.getType() == obj2.getType() && obj1.getFuel() == obj2.getFuel())
    {
        if (obj1.getRate() == obj2.getRate() && obj1.getStatus() == obj2.getStatus())
        {
            retValue = true;
        }
    }
}
return retValue;

}

因为C++与Java不同,支持多重继承,所以你需要明确指定你需要使用哪个super SUPER::operator==()(用真正的超类名替换SUPER)。

需要我在基类中重载 == 运算符,然后在派生类中重写该函数

这似乎是一件非常奇怪的事情。 在可能的情况下,运算符重载通常应该是自由函数,而不是类成员。你能发布一些代码来描述你想更具体地做什么吗?因为不可能对你想要的东西进行一般实现。例如,如果通过基类指针比较派生 1 和派生 2,编译器如何知道要调用哪个operator==?派生 1 和派生 2 都实现了该函数,但无法选择。派生类应该只实现 == 隐藏基类的实现,在少数情况下,有人可能需要做这样的事情。

不要将操作员重载与虚拟功能混为一谈 - 这很痛苦,而且这不是操作员重载的设计操作方式。

如何处理超级返回值?

你没有。C++中没有"super"这样的东西(首先,如果你从两个类继承,语言应该如何知道基本版本是什么?:P)。 如果要调用基类的重载,请直接调用基类函数。例:

class SomeBaseName
{
    int aMember;
public:
    bool operator==(const SomeBaseName& rhs)
    {
        return aMember == rhs.aMember;
    };
};
class Derived : public SomeBaseName
{
    int anotherMember;
public:
    bool operator==(const Derived& rhs) //Note that this is not a virtual function, it is *hidden* instead.
    {
        if (!(SomeBaseName::operator==(rhs))
            return false;
        return anotherMember == rhs.anotherMember;
    }
};

我真的真的强烈建议你不要这样做......在运算符重载的情况下这样做是没有意义的。

如果在来自不同子类的实例上使用运算符,会发生什么情况?例如,sub1 和 sub2 从 base 继承,将在 Main 中为以下代码行执行哪个版本的函数

两者都不会被召唤。调用不明确,将导致编译时错误。

最后

,最后一条建议:不要试图用Java来学习C++。将C++作为一门新语言来学习。它们是不同的语言 - 比它们类似的语法所暗示的还要多。C++允许你做一些在Java中绝对没有等价物的事情(例如指针算术,运算符重载,多重继承,模板元编程等),虽然有些东西在某些地方相似,但两种语言中的惯用示例彼此非常不同。如果你在某些地方认为事情是Java等价物,当语言不同时,或者当C++概念堆积到它(非常不同)的对象模型上时,你会感到困惑。

如果从类继承,则必须使用显式限定符。没有关键字。

class A {
public:
    virtual bool operator==(const A&);
};
class B : public A {
public:
    virtual bool operator==(const B& other) {
        bool result = A::operator==(other);
        //.. do other stuff
    }
};

如果您没有定义一个新的,则调用基本一个。