Почему следующий код выдает ошибку об абстрактном классе? - PullRequest
1 голос
/ 03 января 2011
#include <iostream>
using namespace std;

class Vehicle
{
public:
    Vehicle() {};
    virtual ~Vehicle() {};
    virtual void Move() = 0;
    virtual void Haul() = 0;
};

class Car : public Vehicle
{
public:
    Car() {};
    virtual ~Car() {};
    virtual void Move(int m) { cDist = m;
    cout << "Vehicle moves " << cDist << " miles/hour\n"; }
    virtual void Haul() { cout << "Car's Hauling!\n"; }
private:
    int cDist;
};

class Bus : public Car
{
public:
    Bus() {};
    virtual ~Bus() {};
    void Move(int m) { Move(m); }
    void Haul() { "Bus is Hauling!\n"; }
};

int main()
{
    Vehicle* ptCar = new Car;
    Vehicle* ptBus = new Bus;
    ptCar->Move(1000);
    system("pause");
    return 0;
}

ребята, почему этот код выдаёт мне ошибки при попытке создать экземпляр объекта Car и Bus в main. Я не собирался создавать абстрактный класс Car and Bus, только Vehicle ... любая помощь приветствуется

1>------ Build started: Project: OperatorsTypes, Configuration: Debug Win32 ------
1>  main.cpp
1>c:\users\jorge\documents\visual studio 2010\projects\shapes\operatorstypes\operatorstypes\main.cpp(36): error C2259: 'Car' : cannot instantiate abstract class
1>          due to following members:
1>          'void Vehicle::Move(void)' : is abstract
1>          c:\users\jorge\documents\visual studio 2010\projects\shapes\operatorstypes\operatorstypes\main.cpp(9) : see declaration of 'Vehicle::Move'
1>c:\users\jorge\documents\visual studio 2010\projects\shapes\operatorstypes\operatorstypes\main.cpp(37): error C2259: 'Bus' : cannot instantiate abstract class
1>          due to following members:
1>          'void Vehicle::Move(void)' : is abstract
1>          c:\users\jorge\documents\visual studio 2010\projects\shapes\operatorstypes\operatorstypes\main.cpp(9) : see declaration of 'Vehicle::Move'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Ответы [ 5 ]

4 голосов
/ 03 января 2011

Функция Move в ваших производных классах имеет другую сигнатуру (обе они принимают int).

Чтобы исправить это, добавьте параметр int также в базовый класс.

virtual void Move(int m) = 0
3 голосов
/ 03 января 2011

Вам не хватает параметра m в суперклассе.В Vehicle

virtual void Move(int) = 0;  // add the int

В C ++ с перегрузкой функций aMethod () и aMethod (aArgument) не совпадают.

3 голосов
/ 03 января 2011

Car является абстрактным, поскольку не переопределяет чисто виртуальный void Vehicle::Move().

void Car::Move(int) не переопределяет void Vehicle::Move(), поскольку список его параметров отличается.

2 голосов
/ 03 января 2011

Move принимает 0 аргументов в абстрактном классе Vehicle и int аргумент в Bus и Car, поэтому они являются различными функциями. Измените прототип в Vehicle на

virtual void Move(int) = 0;
0 голосов
/ 03 января 2011

Как показывает ошибка, Car и Bus являются абстрактными, поскольку вы не переопределили void Vehicle::Move() в них.Move(int) - это другая функция.

...