0

現在、ヘッダー ファイルの複数の実装を提供しようとしています。私はこれを次のようにしてみました:

// A.h:

class A {
    public:
        A();
        ~A();

        bool method1();
        bool method2();
}

// A.cpp: 
A::A() {
}

A::~A() {
}

bool A::method1() {
} 

bool A::method2() {
}

// B.h

class B : public A {
    public B();
    public ~B();

    bool method1();
    bool method2();
}

// B.cpp

B::B() {
}

B::~B() {
}

bool B::method1() {
    // actual code I want to use
}

bool B::method2() {
    // actual code I want to use
}

// AFactory.h

#define USE_B 10
#define USE_C 20

#define IMPL USE_B

class A;

class AFactory {
public:
    static A *getImplementation();
}

// AFactory.cpp

A *AFactory::getImplementation() {
#if IMPL == USE_B
    return new B();
#elif IMPL == USE_C
    return new C();
#else 
    return NULL;
#endif
}

// Test.cpp

int main () {
    A *test = AFactory::getImplementation();
    test->method1();
    test->method2();
}

define の値を変更するだけで切り替えることができる、クラス A の複数の実装を提供するというアイデアでしたIMPL。問題は、実際に使用されている実装のメソッドBが呼び出されないことです。代わりに、基本クラスのメソッドAが呼び出されます。A.cpp は決して使用されないか、使用されるべきではないため、ビルドから完全に削除しようとしましたが、ビルドされず、テスト コードに未定義の参照があることがわかりました。

4

1 に答える 1

2

これらのメソッドをオーバーライドする場合は、virtualキーワードを使用します。

class A
{
  virtual bool method1();
}

class B : public A
{
  virtual bool method1(); // If you want to override the base functionality.
}
于 2012-11-06T11:43:25.880 に答える