带有抽象基类的c++虚拟继承



我将尽量使我的意图清楚,因为可能有不止一种方法。首先,我有一个抽象基类FooBase和一个虚函数SayHi()Foo1是众多派生类之一。

class FooBase {
public:
    virtual void SayHi() = 0;
};
class Foo1 : public FooBase {
public:
    virtual void SayHi() {
        std::cout<<"Foo1 says Hin";
    }
};

我也有一个Component类,有时我想实现Foo..类作为Components。我使用了一个模板类,这样FooBase的任何子类都可以有Component包装器。

class FooComponentBase : public Component {
public:
    virtual FooBase& GetFoo() = 0;
};
template <class T>
class FooComponent : public FooComponentBase {
private:
    T m_foo;
public:
    virtual FooBase& GetFoo() {return m_foo;}
};

现在FooComponentBase是包含FooBase的任何子类的组件的接口:

void DoTest() {
    FooComponentBase* pFooComponent = new FooComponent<Foo1>;
    pFooComponent->GetFoo().SayHi();                            // "Foo1 says Hi"
    delete pFooComponent;
}

到目前为止一切顺利,这是可行的。但是,如果FooComponent是从FooBase继承而来,可能会更简洁,所以我们不需要遍历GetFoo()来访问FooBase的方法。

// Inherited version
class FooComponentBase : public Component {};
template <class T>
class FooComponent : public FooComponentBase, public T {};

不幸的是,FooComponentBase不能访问FooBase,尽管它的所有派生类都可以访问;

void DoTest() {
    FooComponentBase* pFooComponent = new FooComponent<Foo1>;
    pFooComponent->SayHi();     // Error, FooComponentBase has no SayHi() function
    delete pFooComponent;
}

我找不到解决这个问题的方法。似乎应该有一种方法,也许可以使用虚拟继承;

class FooComponentBase : public Component, virtual public FooBase {};

但是这也不会编译,因为我们不能实例化一个抽象类。我希望我的意图是明确的,我想使FooComponentBase一个抽象基类,像FooBase,但与Component继承,所以我可以用它来访问每一个风格的FooComponent。有什么简洁的方法吗?

如果您在一个地方使用虚拟继承,那么如果您希望使用相同的基本实现,则必须在所有地方使用它:

class Foo1 : public virtual FooBase {

另一种方法,这不是很好,但可能适合您,将FooBase的所有功能实现在FooComponent:

class FooComponentBase : public Component, public FooBase {
};
template <class T>
class FooComponent : public FooComponentBase {
private:
    T m_foo;
public:
    void SayHi() {m_foo.SayHi();}
};

甚至:

class FooComponentBase : public Component, public FooBase {
};
template <class T>
class FooComponent : public FooComponentBase, public T {
public:
    void SayHi() {T::SayHi();}
};

相关内容

  • 没有找到相关文章

最新更新