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();
}

这个想法是,提供多个 A 类的实现,可以通过简单地更改 define 的值来切换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 回答