为什么以下代码给出了关于抽象类的错误?

时间:2011-01-03 17:34:15

标签: c++ abstract-class

#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时给我错误。我并不打算创建一个抽象类的汽车和公共汽车,只有车辆...... 任何帮助赞赏

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 个答案:

答案 0 :(得分:4)

派生类中的Move函数具有不同的签名(它们都采用int)。

要解决此问题,请在基类中添加int参数。

virtual void Move(int m) = 0

答案 1 :(得分:3)

Car是抽象的,因为它不会覆盖纯虚拟void Vehicle::Move()

void Car::Move(int)不会覆盖void Vehicle::Move(),因为其参数列表不同。

答案 2 :(得分:3)

你在超类中缺少参数m。在车辆

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

在带有函数重载的C ++中,aMethod()和aMethod(aArgument)不相同。

答案 3 :(得分:2)

Move在抽象Vehicle类中使用0个参数,在intBus中使用Car参数,因此它们是不同的函数。将Vehicle中的原型更改为

virtual void Move(int) = 0;

答案 4 :(得分:0)

如错误所示,CarBus是抽象的,因为您没有覆盖其中的void Vehicle::Move()Move(int)是一个不同的功能。