Вам нужно объявить хотя бы один метод чисто виртуальным, например:
class Car {
int weight;
public:
Car(int input) {
weight = input;
}
void sayVroem() {
std::cout << "Vroem...";
}
virtual void ImAPureVirtualMethod() = 0;
};
Если у вас нет виртуальных методов
class Car {
int weight;
public:
void sayVroem() {
std::cout << "Vroem...";
}
protected:
Car () = default;
};
Или сделать деструктор чисто виртуальным, как
class Car {
int weight;
public:
Car(int input) {
weight = input;
}
void sayVroem() {
std::cout << "Vroem...";
}
virtual ~Car() = 0;
};
При использовании виртуальных дескрипторов следует помнить, что при уничтожении производного класса он будет вызывать дескриптор базового класса, поэтому вам потребуется предоставить реализацию, например:
inline Car::~Car() { }
Есть множество вещей, описывающих это:
https://en.cppreference.com/w/cpp/language/abstract_class
https://www.geeksforgeeks.org/pure-virtual-functions-and-abstract-classes/