Причина, по которой полиморфная функция не может возвращать разные типы в разных классах, не в том, что кто-то из комитета C ++ решил, что это «табу», а в том, что любой код, использующий возвращаемое значение этой функции, не может компилироваться.
Создав иерархию наследования, вы можете получить доступ к производным объектам через базовый указатель или ссылку:
class A
{
public:
virtual char operator[](int);
};
class B : public A
{
public:
virtual char operator[](int);
};
A *a;
std::cout << "Do you want to make an A or a B?";
char type;
std::cin >> type;
if (type == 'A')
a = new A();
else
a = new B();
char c = (*a)[0];
Обратите внимание, что в последней строке компилятор не будет знать, на какой тип объекта указывает a
, поскольку он определяется во время выполнения. Это хорошо, потому что независимо от того, на какой тип объекта указывает a
, operator[]
все равно будет возвращать символ. Но что, если этому оператору было разрешено возвращать другой тип в классе B
?
class Sequence
{
...
};
class A
{
public:
virtual char operator[](int);
};
class B : public A
{
public:
virtual Sequence operator[](int);
};
A *a = new B();
char c = (*a)[0];
Очевидно, что последняя строка не имеет смысла, когда a
является объектом типа B
. В этом случае вы пытаетесь присвоить Sequence
персонажу. Аналогичным образом, Sequence c = (*a)[0];
не имеет смысла, если бы a
был объектом типа A
.