Подтвердить что ты не робот

Обходное решение об ошибке параметра

Ниже приведен фрагмент кода:

#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);)

Приветствия

4b9b3361

Ответ 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 (производный конкретный класс).