【问题标题】:function return pointer to parent class from child class [closed]函数从子类返回指向父类的指针[关闭]
【发布时间】:2021-07-07 00:58:04
【问题描述】:

我有这个问题,但我无法解决。我只知道 InitData 函数是 100% 正确的。但是我试图找到如何需要创建我的类以使这段代码工作(不对 InitData 函数做任何更改)

class Bird
{
public:
    int data[10];
    int color;

    Bird() {
        ZeroMemory(data, 10 * 4);
        color = 0;
    }

    Bird(int* _data, int _color) {
        memcpy(data, _data, 10 * 4);
        color = _color;
    }

    //more code

};

class Animal : Bird
{
public:
    int data[10];

    Animal() {
        ZeroMemory(data, 10 * 4);
    }

    Animal(int* _data) {
        memcpy(data, _data, 10 * 4);
    }

    //more code

};

Animal* InitData(int* _data, bool isBird) {

    if (isBird) {
        Bird* bird = new Bird(_data, 0);
        return bird;
    }
    else {
        Animal* animal = new Animal(_data);
        return animal;
    }

    return nullptr;
}

也许对虚拟课程有所帮助?

编译器给我错误'E0120返回值类型与函数类型不匹配',在InitData的这一行'return bird;'。 我使用 Visual Studio 2019、Release(x64)、C++17

已解决: 所以我继承了错误的类。需要将 Animal 继承到 Bird。所以需要改变 “类鸟”到“类鸟:公共动物” 和 'class Animal : Bird' 到 'class Animal'

谢谢大家!

【问题讨论】:

  • 为什么Animal 派生自Bird?应该反过来。
  • 不,您的 InitData 函数不是 100% 正确的。它返回一个指向子类的指针,而 NOT 是父类。
  • 您的编译器是正确的,但有错误。 InitData 承诺返回一个 Animal 但你返回一个 Bird 这是你的基类。正如@0x499602D2 已经指出的那样,您的继承方式是错误的,这也是导致此错误的原因。
  • @SamVarshavchik 和 0x499602D2 对不起,我编辑了标题
  • 是的。鸟是动物,但动物不一定是鸟,因为马也是动物。所以应该是class Animal...; class Bird: public Animal ...

标签: c++ class inheritance virtual-functions


【解决方案1】:

您的继承方式是错误的。 此外,您不需要复制派生类中的数据,因为这是基类的用途,因此您应该调用适当的构造函数,而不是从您的基类中复制代码。

class Animal
{
public:
    int data[10];

    Animal()
    {
        ZeroMemory(data, sizeof(int)*10);
    }

    Animal(int* _data)
    {
        memcpy(data, _data, 10 * sizeof(int));
    }

    //more code
};

class Bird : public Animal
{
public:
    int color;

    Bird()
    {
        color = 0;
    }

    Bird(int* _data, int _color)
    : Animal(_data)
    {
        color = _color;
    }

    //more code

};

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多