C++ C++;:派生的虚函数返回奇怪的结果

C++ C++;:派生的虚函数返回奇怪的结果,c++,C++,我在.HPP文件中创建了一个带有虚拟函数的可派生类,然后在该类的.CPP文件中为其提供了一个默认返回值。接下来,我创建了一个类,该类继承了后一个可派生类,并重载了它的虚拟函数,给它一个新的返回值。但是,返回值并不总是相同的(默认返回值或重载返回值)。有人能帮我修复代码或找到问题吗。谢谢 注意:我提供了示例代码,我相信这些代码足以显示问题 #include <iostream> #include <sstream> using std::cout; using std::

我在.HPP文件中创建了一个带有虚拟函数的可派生类,然后在该类的.CPP文件中为其提供了一个默认返回值。接下来,我创建了一个类,该类继承了后一个可派生类,并重载了它的虚拟函数,给它一个新的返回值。但是,返回值并不总是相同的(默认返回值或重载返回值)。有人能帮我修复代码或找到问题吗。谢谢

注意:我提供了示例代码,我相信这些代码足以显示问题

#include <iostream>
#include <sstream>

using std::cout;
using std::ostream;

class Fruit;
class Apple;

class Fruit
{
    public:
        int Type;

        Fruit();
        ~Fruit();

        Fruit(int = 0);

        virtual const int getVal() const;
};

class Apple : public Fruit
{
    public:
        Apple();
        ~Apple();

        const int getVal() const;
};


Fruit::Fruit() : Type(0) {}
Fruit::~Fruit() {}

Fruit::Fruit(int type) : Type(type) {}

//const int Fruit::getVal() const { return 0; } //Uncommenting this results in function //always returning ZERO; even in Apple::getVal().
const int Fruit::getVal() const { return Type; }

Apple::Apple() : Fruit(1) {}
Apple::~Apple() {}

const int Apple::getVal() const { return Type; }

ostream& operator<<(ostream& a, Fruit b)
{
    return a << b.getVal();
}

int main(int *argc, char **argv)
{
    cout << Apple() << "\n\n";

    #ifdef _WIN32
        system("pause");
    #endif

    return 0;
}
#包括
#包括
使用std::cout;
使用std::ostream;
类水果;
苹果类;
等级水果
{
公众:
int型;
水果();
~Fruit();
果实(int=0);
虚拟常量int getVal()常量;
};
苹果类:公众水果
{
公众:
苹果();
~Apple();
常量int getVal()常量;
};
水果::水果():类型(0){}
水果::~Fruit(){}
水果::水果(int型):类型(type){}
//const int Fruit::getVal()const{return 0;}//取消对其注释将导致函数//始终返回零;即使在Apple::getVal()中也是如此。
const int Fruit::getVal()const{return Type;}
苹果:苹果():水果(1){}
苹果::~Apple(){}
常量int Apple::getVal()常量{返回类型;}

ostream&operator您遇到了一个称为的问题。因为您的
Apple
正在通过值传递给
操作符,所以您遇到了一个称为的问题。因为您的
Apple
正在通过值传递给
操作符,所以您遇到了切片问题。您的
操作员您遇到了切片问题。您的
运算符有一件事跳得很快,那就是您没有通过指针调用getVal(),而且由于您的
运算符有一件事跳得很快,那就是您没有通过指针调用getVal(),因为您的
运算符
ostream&operator
ostream&operator更改此项:
ostream&operator更改此项:

ostream&operator您不能重载或重写返回类型。(但在您提供的代码中,您似乎正在尝试这样做。您的代码与解释不匹配。幸运的是,正如答案所解释的,您的理论是不正确的。:D)您不能重载或重写返回类型。(但在你提供的代码中,你似乎在尝试这样做。你的代码与解释不符。幸运的是,正如答案所解释的那样,你的理论是错误的。:D)好吧,它做的是正确的。这和OP想让它做的事情不一样,它做的是对的。这和OP要求它做的事情不一样。“切片”这个词怎么会让人困惑?从语义上讲,我看不出有什么理由阻止复制对象。它会显示这个bug,但这不一定是一个足够好的理由+谢谢你和其他人的解答。这个解决方案解释得很好,解决了这个问题。我将意识到未来“对象切片”的可能性。+1用于描述切片是什么,我忽略了这一点。如果你以前从未遇到过这个术语,那么它肯定是一个奇怪的术语。@Tomalak Geret'kal我认为它令人困惑,因为你实际上并没有改变被“切片”的对象,这与你实际切片对象时不同。另一方面,你绝对正确,他应该对复制构造函数是否必要进行个人判断。术语“切片”如何混淆?从语义上讲,我看不出有什么理由阻止复制对象。它会显示这个bug,但这不一定是一个足够好的理由+谢谢你和其他人的解答。这个解决方案解释得很好,解决了这个问题。我将意识到未来“对象切片”的可能性。+1用于描述切片是什么,我忽略了这一点。如果你以前从未遇到过这个术语,那么它肯定是一个奇怪的术语。@Tomalak Geret'kal我认为它令人困惑,因为你实际上并没有改变被“切片”的对象,这与你实际切片对象时不同。另一方面,你绝对正确,他应该对复制构造函数是否必要进行个人判断。
ostream& operator<<(ostream& a, const Fruit& b)
{
    return a << b.getVal();
}
ostream& operator<<(ostream& a, Fruit b)