0

C++ でインターフェイスを使用する場合。抽象(親)クラスがあります。次に、親クラスから継承し、純粋仮想関数を実装する子クラスがあります。

別のクラスが (子) インターフェイスを使用する場合、この時点での抽象クラスのポイントは何ですか? 関数で親の型を使用しようとすると、つまり Parent 型を返すと、コンパイラ エラーが発生します (おそらく、コンパイラが割り当てるメモリ量を認識していないためです)。

上記の方法を誰か教えてもらえませんか?

すなわち

親 = シェイプ。子 = 長方形。タイプ Shape を返すメソッドを含む 3 番目のクラス?

ヘルプ/情報をお寄せいただきありがとうございます。

4

3 に答える 3

2

大きな利点は、すべての子が同じインターフェイスを共有することです。親から継承する 2 番目の子 (子 = 円) がある場合、特定のサブクラスに関係なく、両方とも同じ関数を使用できます。

次に、形状へのポインターを持つベクトルがあると想像してください (ベクトル < Shape* >)。基本クラスの Shape に仮想メソッド Draw() がある場合、ベクトルにどの形状があるかは問題ではありません。それを使用できます。 Draw メソッドがどのように実装されているかを明示的に知らなくても、ベクトルの各要素からメソッドを取得できます。

于 2012-07-06T11:03:05.020 に答える
1

抽象クラスをインスタンス化することはできません。限目。基本クラス インターフェイスを介してアクセスする子がある場合は、基本クラスへのポインターまたは参照を介して子にアクセスする必要があります。

class A
{
public:
  virtual void doit() = 0;
}

class B : public A
{
public:
  virtual void doit()
  {std::cout << "Hi.";}
}

...later, in main

A *a = new B;
a->doit(); //this calls B's implementation.

これが便利な理由がわからない場合は、「ポリモーフィズム」という用語を調べてください。

于 2012-07-06T11:04:29.560 に答える
0

スタック上のオブジェクトを返していると思いますが、抽象型をインスタンス化できないため、機能しません。

Parent Child::foo() {
  return Child(12);
}

つまり、コンパイラはParent. またParent、 を呼び出すときにコンストラクトをコピーしようとしますfoo

あなたがおそらく意味したのはこれでした:

Parent* Child::foo() {
  return new Child(12); // actually you should really be using a shared pointer here, but that's a different story
}

ParentへのポインタとへのポインタにChildはサイズと配置があるため、これは機能します。

Child共分散のため、a を直接返すこともできます。C++ では、 をから継承しているかParent* Parent::foo();のように実装できます。Child* Child::foo();ChildParent

于 2012-07-06T11:03:28.343 に答える