Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;具有抽象基类的虚拟继承_C++_Inheritance_Virtual_Abstract_Base - Fatal编程技术网

C++ C++;具有抽象基类的虚拟继承

C++ C++;具有抽象基类的虚拟继承,c++,inheritance,virtual,abstract,base,C++,Inheritance,Virtual,Abstract,Base,我会尽量明确我的意图,因为可能有不止一种方法。首先,我有一个抽象基类FooBase,带有一个虚拟函数SayHi()Foo1是许多派生类之一 class FooBase { public: virtual void SayHi() = 0; }; class Foo1 : public FooBase { public: virtual void SayHi() { std::cout<<"Foo1 says Hi\n"; } }; 现在,F

我会尽量明确我的意图,因为可能有不止一种方法。首先,我有一个抽象基类
FooBase
,带有一个虚拟函数
SayHi()
Foo1
是许多派生类之一

class FooBase {
public:
    virtual void SayHi() = 0;
};

class Foo1 : public FooBase {
public:
    virtual void SayHi() {
        std::cout<<"Foo1 says Hi\n";
    }
};
现在,
FooComponentBase
是包含
FooBase
任何子类的组件的接口:

void DoTest() {
    FooComponentBase* pFooComponent = new FooComponent<Foo1>;
    pFooComponent->GetFoo().SayHi();                            // "Foo1 says Hi"
    delete pFooComponent;
}
不幸的是,
FooComponentBase
无法访问
FooBase
,即使它的所有派生类都可以访问

void DoTest() {
    FooComponentBase* pFooComponent = new FooComponent<Foo1>;
    pFooComponent->SayHi();     // Error, FooComponentBase has no SayHi() function
    delete pFooComponent;
}
但这也不会编译,因为我们不能实例化抽象类。我希望我的意图是明确的,我想使
FooComponentBase
成为一个抽象的基类,像
FooBase
,但是使用
Component
继承,这样我就可以用它访问
FooComponent
的每一种风格。
有没有一种简洁的方法可以做到这一点?

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

class Foo1 : public virtual FooBase {
另一种方法虽然不太好,但可能适合您,就是在
FooComponent
中实现所有
FooBase
函数:

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{
};
模板
类FooComponent:PublicFooComponentBase{
私人:
吴文福,;
公众:
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();}
};
class-FooComponentBase:public-Component,public-FooBase{
};
模板
类FooComponent:publicFooComponentBase,publicT{
公众:
void SayHi(){T::SayHi();}
};

就是这样<代码>Foo1类:公共虚拟FooBaseBrilliant,谢谢:)
class Foo1 : public virtual FooBase {
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();}
};