Я написал абстрактный класс (с чистыми виртуальными функциями), и я хотел бы, чтобы метод принимал один такой класс, как параметр. Учитывая, что класс является абстрактным, я понимаю, что я не мог передать абстрактный класс любому методу, но почему я не могу передать подкласс абстрактного класса этому методу? Как указать, что параметр должен быть любым из подклассов заданного базового класса? Это все на C++.Передайте абстрактный параметр методу, почему бы и нет?
3
A
ответ
3
Необходимо указать параметр в качестве указателя (или ссылки), например. Abstract *
, а не Abstract
. Если Derived
наследует от Abstract
, вы можете передать переменную типа Derived *
, когда ожидается Abstract *
, но вы не можете в общем пройти один из типов Derived
, когда ожидается Abstract
.
0
Вы действительно можете сделать это, заметим:
чисто абстрактный класс:
class Abstract {
public:
virtual void foo() = 0;
};
Дитя функции переопределение члена:
class AbstractImpl : public Abstract {
public:
void foo() override { std::cout << "Hi from subclass\n"; }
};
Теперь мы объявляем метод который принимает ссылочный тип абстрактного класса
void somefunc(Abstract &ab) {
ab.foo();
}
Наконец, в основном мы инстанцируем параметр дочернего класса
int main() {
AbstractImpl test;
somefunc(test); // prints Hi from subclass
return 0;
}
Источника: https://stackoverflow.com/a/11422101/2089675
1
Затем вы используете полиморфизм в C++.
Учитывая любой базовый класс:
struct Base{};
и его подклассы:
struct SubClassA : public Base(){};
struct SubClassB : public Base(){};
Если вы объявляете:
void MyFunctionReference(Base&){};
void MyFunctionPointer(Base*){};
Вы можете позвонить:
{
SubClassA a;
SubClassB b;
MyFunctionReference(a); // by reference
MyFunctionPointer(&b); // by pointer address
}
Смежные вопросы
- 1. Передайте общий параметр неосновному методу
- 2. Передайте параметр методу и прочитайте возвращаемое значение?
- 3. Передайте метод как параметр другому методу
- 4. Invalidate() почему бы и нет?
- 5. Передайте массив строк методу
- 6. Передайте аргумент nullable методу
- 7. Передайте параметр с общим типом методу, не зная тип?
- 8. InnoDB или MyISAM - Почему бы и нет?
- 9. Виртуализированный SQL Server: почему бы и нет?
- 10. Действие не найдено, почему бы и нет?
- 11. Django formet недействителен - почему бы и нет?
- 12. window.location.href не работает, почему бы и нет?
- 13. Передайте значения от конструктора методу
- 14. Передайте значение enum методу ComObject в Powershell
- 15. Передайте любое количество параметров методу?
- 16. Нет многострочной лямки в Python: почему бы и нет?
- 17. Передайте свойство методу, используемому в запросе LINQ
- 18. публичный абстрактный статический метод - почему бы не разрешить?
- 19. Передайте класс как параметр
- 20. Передайте метод как параметр
- 21. Sybase: Не могу создать базу данных: почему бы и нет?
- 22. Передайте итератор как параметр функции
- 23. Передайте местоположение файла методу в java?
- 24. Передайте параметр lambda в оператор включения
- 25. Передайте параметр CSV в Postgres
- 26. Передайте параметр другой функции и внутри innerHTML
- 27. Передайте параметр моему сценарию .net
- 28. Передайте параметр ComboBox.SelectedText другому классу
- 29. Канал как параметр, почему бы не звездочку?
- 30. Должен ли абстрактный класс иметь хотя бы один абстрактный метод?
Это половина смысла использования наследования. Просто попросите метод взять указатель на абстрактный класс, тогда вы можете передать ему указатель на любой производный класс. –
«Учитывая, что класс является абстрактным, я понимаю, что я не мог передать абстрактный класс любому методу». Это верно ** только **, если вы ограничиваете себя передачей по значению. В общем, используйте полиморфизм (передайте по ссылке или пройдите по адресу указателя) при работе с абстрактным и, в более общем смысле, базовым/материнским классом. –