Я хочу создать цепочку вызова как jquery-way в C++. Образец:Тип литья (из производного класса)
$('#obj').getParent().remove();
Итак, как я понимаю, каждый метод класса должен возвращать указатель на себя (это).
Все в порядке, пока я не вызову базовые методы. Код:
class Base
{
Base *base1() { return this; }
Base *base2() { return this; }
};
class Derived : Base
{
Derived *derived1() { return this; }
Derived *derived2() { return this; }
};
Derived *obj = new Derived();
obj->derived1()->derived2(); // Everything is okay
obj->derived1()->base1()->derived2(); // Fail at second step
Несомненно, base1 возвращает указатель для базы. Есть ли способ сделать автоматическое кастинг?
UPD: Может быть, это возможно с помощью макросов? Как
#define CORRECT_RETURN (this)
и
Base::base1() {
return CORRECT_RETURN;
}
Что-то в этом пути. Или компилятор не будет смотреть на такую конструкцию?
Это совсем не так, как работает функция «jquery-way». Конечно, нет способа сделать то, что вы пытаетесь сделать. Функция, которую вы пытаетесь вызвать на Base (после вашего вызова base1()), должна, конечно, находиться в интерфейсе Base. –
Я не уверен, чего вы пытаетесь достичь. Если он объединяет вызовы, вы можете сделать это, добавив бесконечное без использования наследования. Если цель состоит в том, чтобы создать правильно напечатанную копию, вам нужно будет изучить броски типа ковариации или перегрузки. – rerun
Подпись «base()» означает, что вы получаете указатель на базу, что не имеет большого смысла. Имена методов должны быть изменены в соответствии с любой функцией, которую они обслуживают, вместо того, чтобы просто быть геттерами для этого «указателя». Если вы хотите «этот» указатель, просто пропустите геттеры. Вы все равно можете вернуть «это» из любой функции и использовать ковариацию (как предложил Тайлер). –