Вы не можете инициализировать участников, которые не являются непосредственными членами вашего класса.n
не является непосредственным членом deriv
, это непосредственный участник base
.
Однако n
доступен для deriv
, поэтому вы всегда можете назначить его в конструкторе deriv
, но вам действительно нужно инициализировать его в конструкторе base
.
Кроме того, у вас не может быть virtual
конструкторов.Вы хотели использовать virtual
деструкторы?
class base
{
public:
base() : n(0) {} // Are you sure you don't want this?
virtual void show() = 0;
protected:
int n;
};
class deriv : public base
{
public:
deriv()
{
n = 0;
}
virtual void show() {}
};
РЕДАКТИРОВАТЬ (ответ на редактирование ОП): Для этого вам не нужны виртуальные методы:
class CarPart
{
public:
CarPart(const char* newName, int newPrice) : name(newName), price(newPrice) {}
const std::string& GetName() const { return name; }
int GetPrice() const { return price; }
private:
std::string name;
int price;
};
class Tire : public CarPart
{
public:
Tire() : CarPart("Tire", 50) {}
};
Предполагая, что все ваши CarPart
s должны иметь имя и цену, этого должно быть более чем достаточно.