Редактировать: то, что вы хотите, возможно ... однако это действительно плохая идея.
Требование отсутствия выделения памяти категорически невозможно. Умножение должно создать новый объект (по определению), а полиморфный объект должен быть создан в куче (если вы хотите избежать нарезки и обращаться к нему через интерфейс).
Однако, если вы все еще хотите написать I* result = a*b*c
с полиморфным a,b,c
, вы можете сделать это с помощью прокси-объекта и использовать неявное приведение ..
Вы можете создать прокси-объект с добавлением неявного приведения:
struct Iref {
I* ref;
Iref(I* aref):ref(aref){};
operator I*() { return ref; }
Iref operator * (I& b);
Iref operator * (Iref b);
Iref operator * (I* b);
};
С этим прокси и подходящим образом написанными методами вы можете получить:
int main()
{
C a(1), b(2), c(3);
I* result = a*b*c;
return 0;
}
Остается проблема с утечкой памяти. Либо вы используете сборщик мусора с вашим приложением. У меня нет опыта с этим, я просто знаю, что это возможно. Или вы позволяете прокси-объекту обрабатывать освобождение памяти.
Этот довольно сложный трюк должен показать, как operator*
и полиморфизм вместе не очень хорошая идея . Существуют и другие проблемы, так как при полиморфизме вы можете получить a * b
и b * a
с разными результатами.