2012-02-28 12 views
1

私はライブラリによって提供されるクラスGrandparentを持っています。私はGrandparentのサブクラスのためのインタフェースを定義したいと思いますので、私はParentという抽象サブクラスを作成しました:抽象クラスを介して祖父母クラスのコンストラクタに引数を渡す

class Grandparent { 
    public: 
     Grandparent(const char*, const char*); 
}; 

class Parent : public Grandparent { 
    public: 
     virtual int DoSomething() = 0; 
}; 

Grandparentのコンストラクタは2つの引数を取ります。私は...もちろん

class Child : public Parent { 
    public: 
     Child(const char *string1, const char *string2) 
     : Grandparent(string1, string2) 
     {} 

     virtual int DoSomething() { return 5; } 
}; 

のようなものを、二つの引数を持つコンストラクタを持っている私の子クラス、Childを、好きで、ちょうどGrandparentのコンストラクタにこれらを渡したい、Childのコンストラクタを呼び出すことはできませんその親クラスのコンストラクタであり、その親クラスのコンストラクタのみです。しかしParentはコンストラクタを持つことができないので、これらの値をどのようにして祖父のコンストラクタに渡すことができますか?

+0

は、なぜあなたは 'Parent'がコンストラクタを持つことができないということだと思います参照してください? –

答えて

3

Parentは確かにコンストラクタを持つことができます。任意のパラメータを使用してGrandparentコンストラクタを呼び出す場合、それは必須です。

抽象クラスがコンストラクタ、デストラクタ、または他の種類のメンバ関数を持つことを禁止するものは何もありません。それはメンバ変数を持つことさえできます。

Parentにコンストラクタを追加するだけです。 ChildにはParentというコンストラクタがあります。コンストラクタ呼び出しで「世代をスキップする」ことはできません。

class Parent: public Grandparent 
{ 
public: 
    Parent(char const* string1, char const* string2): 
    Grandparent(string1, string2) 
    { } 
    virtual int DoSomething() = 0; 
}; 
+0

何らかの理由で、私は抽象クラスがコンストラクタを持つことができないと考えました。もちろん、あなたのソリューションは素晴らしい仕事でした。ありがとう! – bdesham

+0

Java、C#、Delphiなどの他の言語で* interfaces *を考えているのかもしれません。 C++には、別のインタフェースタイプはありません。 –

+0

はい、私はObjective-Cから来ていますが、私はまだインターフェイスと抽象基本クラスの違いを考え出しています。 – bdesham

関連する問題