Унаследованные функции, возвращающие ссылку на себя с производным типомC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Унаследованные функции, возвращающие ссылку на себя с производным типом

Сообщение Anonymous »

Я пытаюсь создать систему, в которой один базовый класс имеет набор функций, а затем производные классы могут наследовать его и добавлять дополнительные функции. Однако все эти функции возвращают ключевое слово this, и мне нужно, чтобы тип возвращаемого значения в производных классах был указателем на их собственный класс, а не на базовый класс. Как лучше всего это реализовать?
Предпочтительно, чтобы система работала так, чтобы функции можно было вызывать для переменной одну за другой в одной строке. Например, testObject->SetPositionX(5)->SetPositionY(12)->SetRGB(24, 80, 50); или даже testObject->AddChild((new Foo)->SetBorderWidth(5)-> SetBorderStyle(BorderStyle::dotted)); Проблема, однако, в том, что если вызывается функция, определенная в базовом классе, а не в производном классе, она вернет указатель типа базового класса и лишит доступа ко всем функциям производного класса.
В качестве полной демонстрации

Код: Выделить всё

#include 

class Base {
public:
Base* CommonFunc() {
std::cout UniqueFunc()*/; // This line doesn't compile with the last function uncommented because CommonFunc() returns a Base* instead of a Foo* and UniqueFunc() is not part of the Base class.

return 0;
}

/* Output:
Unique function of the Foo class
Unique function of the Foo class
Common function part of Base and all derived classes
[Can't call unique function again or else compile error] */
Мое решение до сих пор заключалось в том, чтобы сделать базовые функции виртуальными и переписать их определения в каждом производном классе. Небольшое переписывание: они выполняют один и тот же код, просто вызывая унаследованный класс в одной строке, например Foo* Foo::CommonFunc() {Base::CommonFunc(); верните это;. В полной демонстрации примерно так:

Код: Выделить всё

#include 

class Base {
public:
virtual Base* CommonFunc() {
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/78686617/inherited-functions-returning-self-reference-with-derived-type[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»