C ++重载和选择正确的功能

时间:2012-10-26 08:15:35

标签: c++

C ++重载方法问题

我有1个父类调用Vehicle

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

我有这个值调用getNoOfWheels();

家长班得到了这个方法,摩托车和汽车也得到了。

让我说我提示用户输入

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

基于用户输入,我如何使程序选择正确的基于vehicleType的功能,我知道如果VehicleType ==我可以使用,但那就是超载的目的。

早先就使用虚方法给出了建议。在这种情况下

virtual int noOfVerticles() const { return 0; }

对于shape.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; }

感谢!

3 个答案:

答案 0 :(得分:1)

当你这样做时

Car &rCar = &cVehicle;

然后您将rCar声明为引用,但您为其指定了指针。 &符号(&)根据其使用位置做不同的事情。

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


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

让我们说你有这个宣言:

Vehicle *pVehicle = new Car;

现在变量pVehicle是指向基类的指针,但是因为它被分配了一个指向子类的指针,所以虚拟函数无论如何都会起作用:

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

以上将打印出轮数为4,因为编译器会自动调用正确的函数。如果您稍后将pVehicle更改为指向Motorcycle个实例,并再次执行上述打印输出,则会正确地说2。

答案 1 :(得分:0)

虚拟方法的全部意义在于您可以通过统一的方法调用来调用特定于类型的方法。

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

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

当您在程序中调用noOfVerticles()时,它会调用[pointer to getNoOfWheels()]指向的任何内容(这与“正常调用”相反,这将调用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's answer已经涵盖了这一点。

答案 2 :(得分:0)

尝试使用..

Vehicle *vehicle1= new Car(); 

Vehicle *vehicle2= new MotorBike();

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

同样适用于参考变量。