Обходное решение об ошибке параметра
Ниже приведен фрагмент кода:
#include <iostream>
using namespace std;
class A
{
public:
virtual void print() = 0;
};
void test(A x) // ERROR: Abstract class cannot be a parameter type
{
cout << "Hello" << endl;
}
Есть ли решение/обходное решение для этой ошибки другое/лучше, чем замена
virtual void print() = 0;
с
virtual void print() = { }
EDIT: я хочу иметь возможность передать любой класс, расширяющий/реализующий базовый класс A в качестве параметра, используя полиморфизм (т.е. A* x = new B() ; test(x);
)
Приветствия
Ответы
Ответ 1
Поскольку вы не можете создать экземпляр абстрактного класса, передача его по значению почти наверняка является ошибкой; вам нужно передать его указателем или ссылкой:
void test(A& x) ...
или
void test(A* x) ...
Передача по значению приведет к разбиению объектов, почти гарантированно будет иметь неожиданные (в плохом смысле) последствия, поэтому флаги компилятора это как ошибка.
Ответ 2
Конечно, измените подпись:
void test(A& x)
//or
void test(const A& x)
//or
void test(A* x)
Причина, по которой ваша версия не работает, связана с тем, что объект типа A
логически не имеет смысла. Это абстракция. Передача ссылки или указателя обойти это, потому что тип фактический, переданный как параметр, не A
, а реализующий класс A
(производный конкретный класс).