2016-10-31 6 views
-1

私は抽象クラス 例から派生したクラスに問題があります。抽象クラスからクラスコンストラクタを派生

#include <iostream> 

using namespace std; 

class A 
{ 
protected: 
    int a,b; 
public: 
    A(): a(0), b(0) {} 
    A(int na,int nb): a(na), b(nb) {} 
    virtual void print() = 0; // Reason to be an abstract class 
}; 

class B : public A 
{ 
public: 
    B(int a, int b) {A(a,b);} 
    void print() 
    { 
    cout << a << endl; 
    cout << b << endl; 
    } 
}; 

int main(){ 

    B clase(3,2); 
    clase.print(); 
    return 0; 
} 

上記のコードは次のように私にエラーを与える:

lab1.cpp: In constructor ‘B::B(int, int)’: 
lab1.cpp:20:10: error: invalid cast to abstract class type ‘A’ 
    A(a,b); 
     ^
lab1.cpp:5:7: note: because the following virtual functions are pure within ‘A’: 
class A 
    ^
lab1.cpp:12:16: note: virtual void A::print() 
    virtual void print() = 0; 
       ^

注意を:私はそれを動作させる方法を知っている、Bのコンストラクタはこのようになります:

B(int a, int b): A(a,b) {} 

しかし、私の本当の疑問は、私の派生クラスのコンストラクタを(上記のコードのような)枝の中で呼びたいのですが? 分岐内で抽象コンストラクタを呼び出す正しい方法は何ですか?

+0

実際にオブジェクトを構築せずに請負業者に電話したいのですか?どうして ? ...そしてもっと重要な理由は何ですか? – HazemGomaa

+0

'A(a、b)'は 'A'を構築することを意味します。これは抽象的なので失敗します。 – songyuanyao

+0

"分岐内の派生クラスのコンストラクタを呼び出す場合はどうすればいいですか" BのコンストラクタでBのコンストラクタを呼び出すことを意味しましたか? – songyuanyao

答えて

1

分岐内で抽象コンストラクタを呼び出す正しい方法は何ですか?

ありません。

これには非常に良い理由があります。スーパークラスは、クラスを構築する前に構築する必要があります。

コンストラクタのコードを記述するとき、合理的に構築されたオブジェクトがあります。あなたの親は少なくとも構築されています。

これは、コンストラクタの初期構文でうまく表現されます。

B::B(int a, int b):A(a, b) { 
    // A is complete. now we can do stuff. 
0

あなたがいないBのコンストラクタの本体内にメンバー初期化子リストにBのA部を初期化する必要があります。

class A 
{ 
    virtual void print() = 0 {cout << "I am Pure function";} 
}; 

class B : public A 
{ 
    public: 
     B(int a, int b) : A(a,b) {} 
     // B(int a, int b) {A(a,b);} /. incorrect 
     void print() 
     { 
     cout << a << endl; 
     cout << b << endl; 
     } 
}; 
  • をあなたもからオブジェクトを許可するように、純粋仮想関数を定義することができます機能のために連鎖する派生クラスです。
関連する問題