2012-05-09 10 views
2

私はまだテスト/コンパイルとそれが可能かどうか、そしてそれが悪い設計であるか疑問に思っていないという問題がありますか?2つの抽象クラスからの継承

私の問題:私は抽象基底クラスAと抽象派生クラスB

を持ちたい

私はこれが可能であるならば、私は各クラスに純粋仮想メンバ関数の番号を持つことになります実現これらのオブジェクトを初期化することはできませんが、これは抽象クラスに与えられています。私の設計では

私はその後、初期化します別の派生クラスCになります - クラスCはクラスB

から派生されるだろう、私はこの

class C 
^
    | 
abstract class B 
^
    | 
abstract base class A 

私の質問のように見えた何かを持っているだろうし:

まずこれが可能ですか?私はそれを疑うだろうが、クラスBのAの純粋な仮想関数を宣言するのは面倒かもしれない?

e.x。

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

class B: public A { 
    public: 
    virtual void test()=0; 
    virtual void anotherTest()=0; 
}; 

上記は大丈夫ですか?

この悪いC++デザインですか?将来私はAからクラスを派生させていますので、このデザインを持つことはいいでしょう。

+4

「それは可能ですか?質問:あなたはそれをコンパイルするのを待っていますか? 「それは悪いデザインですか?質問:あなたが設計しているものの要件を知らなくても、実際にそれを伝えることはできません。 –

+3

はい、その罰金。なぜこれは悪いデザインですか?例えばAnimalとその子孫Mammalはどちらも抽象型ですが、さらに具体的なクラスのための良い基盤です。 – StuartLC

+0

私はそれを書き終えていません。 :-Dプラス私は抽象クラスデザインをやっているかどうか検討したかった。 – MWright

答えて

2

何も問題ありません。例を次に示します。

stefanos-imac:dftb borini$ more test.cpp 
#include <iostream> 
class A { 
public: 
    A(void) { std::cout << "A" << std::endl; } 

    virtual void method1() = 0; 
}; 

class B : public A { 
public: 
    B(void) : A() { std::cout << "B" << std::endl; } 

    virtual void method2() = 0; 
}; 

class C : public B { 
public: 
    C(void) : B() { std::cout << "C" << std::endl; } 

    virtual void method1() { std::cout << "method1" << std::endl; } 
    virtual void method2() {std::cout << "method2" << std::endl; } 
}; 

int main() { 
    C c; 
    c.method1(); 
    c.method2(); 
} 
stefanos-imac:dftb borini$ ./a.out 
A 
B 
C 
method1 
method2 

基本的なC++を入力することができます。

+1

ちょうど私が見たいと思ったもの - 次回は質問をする前に自分でテストします!乾杯Stefano! – MWright

+0

@MWright:通常、私たちは「研究努力はしていません」という質問に対してはダウンボートしていますが、あなたがサイトを初めて知ったためにあなたを惜しまなかったのです。 –

関連する問題