0

私はポリモーフィズムを学んでおり、php に精通しています。

https://stackoverflow.com/a/749738/80353からこの優れた例に出くわしました。以下に再掲。

同じコードを C++ で書くにはどうすればよいですか?

C++ のデータ構造は厳密であると私は信じているので (私が間違っているかもしれません)、自分で書くのに問題があります。

同じ型の C++ のリンク リストまたは配列内のすべての要素が必要です。

したがって、猫と犬を基本クラスとしてデータ構造に格納する必要があると思います。

では、この php コード スニペットを、1 つのデータ型の要素しか格納できない厳密なデータ構造を使用する C++ コード スニペットに書き込むにはどうすればよいでしょうか?

class Animal {
    var $name;
    function __construct($name) {
        $this->name = $name;
    }
}

class Dog extends Animal {
    function speak() {
        return "Woof, woof!";
    }
}

class Cat extends Animal {
    function speak() {
        return "Meow...";
    }
}

$animals = array(new Dog('Skip'), new Cat('Snowball'));

foreach($animals as $animal) {
    print $animal->name . " says: " . $animal->speak() . '<br>';
}
4

3 に答える 3

0

C++ に慣れていない人として、index.cpp ファイルを作成し、次の内容を入力します。

#include <iostream>
#include <vector>
#include <memory>

using namespace std;

class Animal {
  public:
    std::string name;
    Animal (const std::string& givenName) : name(givenName) {}
    virtual string speak () = 0;
    virtual ~Animal() {}

  };

class Dog: public Animal {
  public:
    Dog (const std::string& givenName) : Animal (givenName) {

    }
    string speak ()
      { return "Woof, woof!"; }
  };

class Cat: public Animal {
  public:
    Cat (const std::string& givenName) : Animal (givenName) {
    }
    string speak ()
      { return "Meow..."; }
  };

int main() {
    std::vector<std::unique_ptr<Animal>> animals;
    animals.push_back( std::unique_ptr<Animal>(new Dog("Skip"))  );
    animals.push_back( std::unique_ptr<Animal>(new Cat("Snowball"))  );

    for( int i = 0; i< animals.size(); ++i ) {
        cout << animals[i]->name << " says: " << animals[i]->speak() << endl;
    }

}

その後、次のコマンドで index.cpp ファイルをコンパイルします。

c++ index.cpp -std=c++11 -stdlib=libc++

コードでスマート ポインター unique_ptr を使用しているため、これが必要です。

最後に、コンパイル済みの実行可能出力ファイルを実行できます。これは a.out である必要があります。

./a.out
于 2012-11-06T02:10:08.930 に答える
0

さて、次のような純粋仮想メソッドを使用して、抽象クラスでポインターを使用できます。

class Polygon {
    public:
        virtual void setValue(int k) = 0;    // Declaring our pure virtual method.
};

class Rect : public Polygon {
    public:
        virtual void setValue(int k); = 0;   // Declaring the pure virtual method again.
};

Rect::setValue(int k) {    // You must create a setValue() method for every class, since we made a pure virtual method. This is the Polymorphic part.
    // Code in here that setValue() method executes.
    int foo = a;
    std::cout << foo << std::endl;
}

これで、オブジェクト ポインターを宣言するメソッドにアクセスできます。

int main() {
    Polygon* pSomePolygon = nullptr;   // Assuming using C++11.
    Rect* pRect = new Rect;    // Declare our object.

    pSomePolygon = pRect;    // Point our pointer to object 'pRect'.

    pSomePolygon->setValue(18);    // Pointer accesses pRect and uses the pure virtual method.
    delete pRect;    // Clean up!

    return 0;
}
于 2012-11-04T05:19:23.367 に答える
0

あなたはそれらの保存についてのみ尋ねたので、 、 、 の実装は省略AnimalDogますCat

vector< shared_ptr<Animal> > animals;
animals.push_back( new Dog("Skip") );
animals.push_back( new Cat("Snowball") );

for( size_t i = 0; i< animals.size(); ++i )
    cout << animals[i]->name << " says: " << animals[i]->speak() << endl;

基本的に、オブジェクトへのポインタを格納する必要があります。簡単に言えば、shared_ptr<T>ポインタを格納し、参照されなくなったら削除するクラスです。

于 2012-11-04T05:36:06.790 に答える