4

C++ の継承について私が理解していることは、子クラスのコンストラクターが呼び出されるたびに、親クラスのコンストラクターが自動的に呼び出されるということです。また、テンプレート化されたコンストラクタに関しては、テンプレート引数のデータ型は自動的に推測されます。つまり、テンプレート引数を個別に指定する必要はありません。プログラムは、私が理解していないように見えるコンパイル エラーを生成します。

#include <iostream>
#include <list>
#include <algorithm>

using namespace std;

class A{
  public:
    int x;
    int y;
    int first(){
      return x;
    }
    int second(){
      return y;
    }
};

class C{
  public:
    float a,b;
    C(){
      a = 0.0f;
      b = 0.0f;
    }
    template<class T>
      C(T t){
        a = t.first();
        b = t.second();
      }
};

class D: public C{
  public:
    float area(){
      return a*b; 
    }
}

int main(){
  A a;
  a.x = 6;
  a.y = 8;
  C c(a);
  D d(a);
  cout<<c.a<<" "<<c.b<<" "<<d.area()<<endl;
}

コンパイルエラーが発生しました

test.cpp: In function ‘int main()’:
test.cpp:56:8: error: no matching function for call to ‘D::D(A&)’
test.cpp:56:8: note: candidates are:
test.cpp:44:7: note: D::D()
test.cpp:44:7: note:   candidate expects 0 arguments, 1 provided
test.cpp:44:7: note: D::D(const D&)
test.cpp:44:7: note:   no known conversion for argument 1 from ‘A’ to ‘const D&’

ここで何が起こっているのかわかりません。何か案は?

4

2 に答える 2

6

DCデフォルトのコンストラクターを使用していないため、コンストラクター引数を に渡す必要があります。

class D : public C {
public:
    template <typename T> D (T t) : C(t) {}
    float area () { /* ... */ }
};

エラーの理由はD、パラメーターを使用して構築しようとしているが、それを可能にするコンストラクターを宣言していないことです。さらに、パラメータを に渡す必要がありますC。そうしないと、コンパイラはCのデフォルト コンストラクタを使用します。

コンパイラのエラー メッセージは、次のように分析できます。

test.cpp:56:8: error: no matching function for call to ‘D::D(A&)’

コンパイラは次のことについて不平を言っています。

D d(a);

Dそして、 type の何かが渡されたときに a を構築する方法を理解できないことA

次に、認識しているコンストラクターの 2 つの選択肢を提示します。

test.cpp:44:7: note: D::D()
test.cpp:44:7: note: D::D(const D&)

そして、それぞれに使えない理由があることを指摘しています。最初のものについては、引数は必要ありません。2 つ目については、 type の何かを type に変換する方法がありませAD

于 2012-06-11T18:05:16.677 に答える
1

C++ の継承について私が理解していることは、子クラスのコンストラクターが呼び出されるたびに、親クラスのコンストラクターが自動的に呼び出されるということです。

注意: 親クラスのコンストラクターは、子クラスのコンストラクターと同じ引数で自動的に呼び出されます。

目前の特定の問題については、クラス D に対して宣言されたコンストラクターはありません。デフォルトのコンストラクターとコピー コンストラクターは景品として取得されますが、クラス C のテンプレートベースのコンストラクターは取得されません。コンストラクターは継承されません。

于 2012-06-11T18:32:05.400 に答える