【问题标题】:Method returning base class rather than derived class c++方法返回基类而不是派生类 c++
【发布时间】:2014-11-11 16:05:51
【问题描述】:

我来自 C# 背景,所以我希望这是有道理的。

我有一个基类和一个派生类。我希望能够定义一个对从基派生的任何类进行操作的方法,然后返回对象本身。这是一个例子:

class base
{
public:
    virtual void print()
    {
        cout << "Base" << endl;
    }
};

class derived : public base
{
public:
    void print()
    {
        cout << "Derived" << endl;
    }
};

int main()
{
    derived a;
    a.print();
    base b = doPrint(a);
    b.print();
}

base doPrint(base obj)
{
    obj.print();
    return obj;
}

我得到的输出是

衍生的 根据 根据

我想要得到的是“Derived \n Derived \n Derived”,即我希望对象一直被视为 Derived 类。这很重要,因为它可以返回从基类派生的任何类。

我该怎么做?它与泛型类有关吗?

谢谢

[编辑] 这可以通过将“doPrint”方法放入一个具有我可以分配为派生类的泛型类型的类中来完成吗?” [/编辑]

【问题讨论】:

  • 通过引用传递对象。
  • 了解object slicing
  • 将 doPrint 的签名更改如下:base&amp; doPrint(base&amp; obj) 并像这样定义 b:base&amp; b = doPrint(a);
  • 在学习一门新语言时,您的第一个参考资料应该是一本书,或者其他不需要人工关注的资源。非常最后的资源是 Stack Overflow。

标签: c++ polymorphism


【解决方案1】:

在 C++ 中,参数传递是通过复制进行的,并且没有隐式指针。因此,当您调用 doPrint 时,它会从其参数中实例化一个新的 Base 。如果你想传递 Derived 实例本身,你必须通过指针或引用来传递:

base &doPrint(base &obj)
//   ^            ^
{
    obj.print();
    return obj;
}

【讨论】:

    猜你喜欢
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多