可以在返回值中使用虚函数吗?

Jon*_*tan 1 c++ virtual return-value

我有点惊讶以下代码没有按预期工作:

#include "stdio.h"

class RetA
{
public:
    virtual void PrintMe () { printf ("Return class A\n"); }
};

class A
{
public:
    virtual RetA GetValue () { return RetA (); }
};

class RetB : public RetA
{
public:
    virtual void PrintMe () { printf ("Return class B\n"); }
};

class B : public A
{
public:
    virtual RetA GetValue () { return RetB (); }
};

int main (int argc, char *argv[])
{
    A instance_A;
    B instance_B;
    RetA ret;

    printf ("Test instance A: ");
    ret = instance_A.GetValue ();
    ret.PrintMe (); // Expected result: "Return class A"

    printf ("Test instance B: ");
    ret = instance_B.GetValue ();
    ret.PrintMe (); // Expected result: "Return class B"

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

那么,返回值时虚拟方法不起作用吗?我应该恢复在堆上分配返回类,还是有更好的方法?

(实际上我想这样做是为了让一些继承自容器类的不同类根据类返回不同的迭代器类实例...)

Ark*_*nez 17

多态行为不能按值运行,您需要返回指针或引用以使其工作.

如果按值返回,则会得到所谓的"切片",这意味着只返回对象的父部分,因此您已成功将子对象条带化为父对象,这根本不安全.

看看: 什么是对象切片?