1

C++方法重载问题

我有 1 个父类调用 Vehicle

我有 2 个孩子班级叫摩托车和汽车

我有这个值调用 getNoOfWheels();

父类得到了那个方法,摩托车和汽车也得到了。

假设我提示用户输入

string vehicleType;
cout << "What is your vehicle type" << endl;
cin >> vehicleType;

根据用户输入,我如何使程序根据 vehicleType 选择正确的功能,我知道如果 VehicleType== 可以使用,但这违背了重载的目的。

之前有人建议使用虚拟方法。在这种情况下

virtual int noOfVerticles() const { return 0; }

对于形状.h

我对汽车和摩托车有相同的功能,但是我如何让 noOfVerticles 从基于 vehicleType 的子类中选择正确的功能

我试过这样的东西..

Vehicle cVehicle;
Car &rCar = &cVehicle;


if(inVehicle=="Car")
{
cout << rCar.noOfWheels() << endl;
}

我得到一个错误说..

invalid initizliation of non-const refenrece of type "Car&" from an rvaleu of type Vehicle*

和 ...

这是我在 Car.cpp 的虚拟功能

public:
virtual int noOfWheels() const { return 4; }

谢谢。!

4

3 回答 3

1

当你这样做

Car &rCar = &cVehicle;

然后您声明rCar引用,但您为其分配了一个指针。与号( &) 会根据使用的位置执行不同的操作。

使用时,&cVehicle是运算符的地址,并返回一个指向cVehicle. 当在变量声明中使用时,它会告诉编译器该变量是一个引用。


至于你的问题,看来你做的有点不对。使用虚方法时,您不必检查对象的类型,编译器会为您处理它。

假设你有这个声明:

Vehicle *pVehicle = new Car;

现在变量pVehicle是一个指向基类的指针,但是由于它被分配了一个指向子类的指针,所以虚函数无论如何都可以工作:

std::cout << "Number of wheels = " << pVehicle->noOfWheels() << '\n';

上面会打印出轮子的数量是 4,因为编译器会自动调用正确的函数。如果您稍后更改pVehicle为指向一个Motorcycle实例,并再次执行上述打印输出,它将正确显示 2。

于 2012-10-26T08:34:24.983 回答
0

虚拟方法的重点是让您能够通过统一的方法调用来调用特定于类型的方法。

这在内存中是这样表示的(这不是实际的内存布局,只是为了更好的想象):

[some class attribute]
[another class attribute]
[pointer to getNoOfWheels()]
[more class attributes]

当您noOfVerticles()在程序中调用时,它会调用[pointer to getNoOfWheels()]指向的任何内容(这与“正常调用”相反,即调用 to Vehicle::getNoOfWheels())。

当您创建以下实例时Vehicle

[pointer to noOfVerticles] = Vehicle::getNoOfWheels()

如果您创建CarBike将表示:

[pointer to noOfVerticles] = Car::getNoOfWheels()
[pointer to noOfVerticles] = Bike::getNoOfWheels()

假设您具有以下类层次结构:

class Vehicle {
public:
    virtual int getNoOfWheels() const { return 0; } // Though this should be pure virtual method
}

class Car : public Vehicle {
public:
    virtual int getNoOfWheels() const { return 4; }
}

class Bike : public Vehicle {
public:
    virtual int getNoOfWheels() const { return 2; }
}

所以突然间会发生这样的事情:

Vehicle *one = new Vehicle(),
        *two = new Car(),
        *three = new Bike();

one->getNoOfWheels(); // Vehicle::getNoOfWheels() - thus 0
two->getNoOfWheels(); // Car::getNoOfWheels() - thus 4
three->getNoOfWheels(); // Bike::getNoOfWheels() - thus 2

// And you still call original method of a vehicle in car:
two.Vehicle::getNoOfWheels(); // 0

您现在唯一要做的就是为汽车分配正确的新实例,但这已经包含在ForEverS 的答案中。

于 2012-10-26T08:40:50.307 回答
0

尝试使用..

Vehicle *vehicle1= new Car(); 

Vehicle *vehicle2= new MotorBike();

您可以调用该函数vehicle1->getNoOfWheels()vehicle2->getNoOfWheels(). 这将调用 Car 和 MotorBike 类的函数。仅当您在基类车辆中声明您作为虚拟功能时才会发生这种情况。

同样适用于参考变量。

于 2012-10-26T10:50:01.020 回答