Я был немного удивлен, что следующий код не работал должным образом:
#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;
}
Итак, виртуальные методы не работают при возврате значения? Должен ли я вернуться к выделению возвращаемого класса в куче, или есть лучший способ?
(На самом деле я хочу сделать это, чтобы несколько разных классов, которые наследуются от класса контейнера, возвращали разные экземпляры класса итератора в зависимости от класса ...)