C++重载和挑选合适的功能

问题描述:

C++重载的方法质疑C++重载和挑选合适的功能

我有1个父类调用车辆

我有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; } 
我的虚拟功能

谢谢!

+0

它看起来像一个作业问题。在这种情况下,请添加标签作业。此外,首先向我们展示您尝试的内容,然后提出具体问题。 – sahaj

+1

@sahaj作业标签[obsolete](http://stackoverflow.com/tags/homework/info) –

+0

我加了我试过的。 – user1600289

当你

Car &rCar = &cVehicle; 

则声明rCar是一个参考但你分配给它一个指针。 &符号(&)根据使用位置做不同的事情。

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


至于你的问题,看来你是周围做一个小错误的方式。当使用虚拟方法时,您不必检查对象的类型,编译器会为您处理它。

比方说你有这样的声明:

Vehicle *pVehicle = new Car; 

现在变量pVehicle是一个指向基类,但由于它分配一个指向子类的虚函数无论如何都会正常工作:

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

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

虚拟方法的全部要点是您可以通过统一方法调用来调用类型特定的方法。

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

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

当你在程序中调用noOfVerticles(),它调用任何[pointer to getNoOfWheels()]指向(此与“正常呼叫”相反,这将是致电Vehicle::getNoOfWheels())。

当您创建的Vehicle例如:如果您创建CarBike会表示

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

[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

使用try ..

Vehicle *vehicle1= new Car(); 

Vehicle *vehicle2= new MotorBike(); 

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

同样适用于参考变量。