1

C++メソッドのオーバーロードに関する質問

私は1つの親クラスの呼び出し車両を持っています

私は 2 つの子クラス call Motorcycle と Car を持っています

この値は 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; }

ありがとう。!

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

使ってみて..

Vehicle *vehicle1= new Car(); 

Vehicle *vehicle2= new MotorBike();

関数vehicle1->getNoOfWheels()またはを呼び出すことができますvehicle2->getNoOfWheels()。これにより、Car および MotorBike クラスの関数が呼び出されます。これは、基本クラスの車両で機能を仮想として宣言した場合にのみ発生します。

参照変数についても同様です。

于 2012-10-26T10:50:01.020 に答える
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()

あなたが作成した場合、CarまたはBikeそれが表される場合:

[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

あなたが今やるべきことは、適切な新しいインスタンスを car に割り当てることだけですが、それはForEverS の answerで既にカバーされています。

于 2012-10-26T08:40:50.307 に答える