-2

C ++では、基本クラスの代わりに関数/メソッドに派生クラスを渡し、派生クラスに関する情報をまだ持っていますか?. 例: 基本クラス: "geometry" と他のクラス: "shape" フォームがあり、"rectangle" と "circle" を派生させているとします。

double area::geometry( shape& object, int i )
    { 
    if i = 1:
        rectangle thisObject = object;
        double side1 = thisObject.getheight();
        double side2 = thisObject.getwidth();
    if i = 2: 
        circle thisObject = object;
        double side1 = thisObject.radius * thisObject.radius;
        double side2 = 3.14;
    return side1 * side2;
    }

問題は、"return side1 * side2" が非常に複雑なコードであり、繰り返したくないということです。そのため、オーバーロードするよりも、関数への入力の種類に応じて問題を設定することを好みます。

考え方はこれと非常によく似ています:基本クラスをパラメータとして取る関数への参照によって派生クラスを渡すことは可能ですか? ありがとう!

編集:コードをより明確にしようとしました。

4

2 に答える 2

3

func渡すときにどのタイプかを知る必要がある場合obは、「あなたは間違っています」。ポリモーフィズムの全体的なポイントは、すべてのオブジェクトが外部の観察者からは同じように見えますが、内部では異なることを行うということです。典型的な例は動物です:

#include <iostream>

using namespace std;

class Animal
{
  public:
    virtual void Say() = 0;
};

class Dog : public Animal
{
  public:
    void Say() { cout << "Woof Woof" << endl; } 
};

class Pig : public Animal
{
  public:
    void Say() { cout << "All animals are equal, but pigs are "
                         "more equal than other animals" << endl; }
};

class Cat : public Animal
{
  public:
    void Say() { cout << "Meow, Meow" << endl; };
};


void AnimalTalk(Animal *a[], int size)
{
   for(int i = 0; i < size; i++)
   {
     a[i]->Say();
   }
}


int main()
{
   Cat c;
   Pig p;
   Dog d;
   Animal* list[3] = { &p, &c, &d };

   AnimalTalk(list, 3);
}
于 2013-09-10T00:24:09.090 に答える
3

通常のアプローチは、ポリモーフィズムを使用することです。

void func(const base& ob)
{
  ob.doSomethingPolymorphic();
}

ここでdoSomethingPolymorphic()は の仮想メンバー関数ですbase

于 2013-09-10T00:12:32.087 に答える