-2
#include <iostream>

struct Shape
{
    virtual Shape* duplicate() { return new Shape; }
    virtual void print() { std::cout << "SHAPE" << std::endl; }
    virtual ~Shape() {}
};

struct Box : public Shape
{
    virtual Box* duplicate() { return new Box; }
    virtual void print() { std::cout << "BOX" << std::endl; }
};

int main(int argc, char** argv) 
{ 
  Shape* s1 = new Box;
  Box* b1 = s1->duplicate();

  b1->print();

  delete s1;
  delete b1;

  return 0; 
}

これが関数ポインターの構文であるかどうかはわかりませんが、そうである場合でも、メイン関数が混乱します...さらに、オブジェクト宣言中にポインターが使用されています..私はそのような宣言に慣れていないので、このコードがどのように説明されているかを説明してください作品..???

4

1 に答える 1

1

以下は、引数を取らず、 へのポインターを返す仮想関数を定義しますShape

struct Shape
{
    virtual Shape* duplicate() { return new Shape; }

以下はこの関数をオーバーライドします

struct Box : public Shape
{
    virtual Box* duplicate() { return new Box; }

戻り値の型が に変更されていることに注目してくださいBox*Boxは のサブクラスであるため、これは許容されShapeます。これは、共変の戻り値の型と呼ばれます。

次の例では、ポインターBox::duplicate()を介して呼び出しを試みています。Shape*

  Shape* s1 = new Box;
  Box* b1 = s1->duplicate();

Shape::duplicate()が返され、が返されないため、これはコンパイルされShape*ませんBox*

于 2013-01-06T09:57:16.483 に答える