避免C ++虚拟继承

史提芬

我正在尝试使用实现类的等效层次结构从抽象基类的层次结构继承。我弄清楚如何做到这一点的唯一方法是使用虚拟继承。

/* Foo Interface */
class IFoo
{
public:
    virtual void foo() = 0;

    virtual ~IFoo() = default;
};

/* Bar Interface */
class IBar : virtual public IFoo
{
public:
    virtual void bar() = 0;

    virtual ~IBar() = default;
};

/* A specialized Foo */
class SpecificFoo : virtual public IFoo
{
public:
    void foo() override { std::cout << "Foo!\n"; }
};

/* A specialized Bar */
class SpecificBar : virtual public IBar, virtual public SpecificFoo
{
public:
    void bar() override { std::cout << "Bar!\n"; }
};

int main()
{
    SpecificBar b;

    b.bar();

    return 0;
}

尽管我并不完全反对使用虚拟继承,但是我不确定这是否正确。如果可能,必须避免使用dynamic_cast。有一个更好的方法吗?

我已经尝试过使用适配器模式的东西,但是复制/粘贴包装器方法已经失控了。

史提芬

我想出了一个避免虚拟继承的解决方案,但也避免了代码重复。我使用了模板参数来指定基类。

/* Foo Interface */
class IFoo
{
public:
    virtual void foo() = 0;

    virtual ~IFoo() = default;
};

/* Bar Interface */
class IBar : public IFoo
{
public:
    virtual void bar() = 0;

    virtual ~IBar() = default;
};

/* A specialized Foo */
template <typename _BaseClass>
class SpecificFooTpl : public _BaseClass
{
public:
    void foo() override { std::cout << "Foo!\n"; }
};

using SpecificFoo = SpecificFooTpl<IFoo>;

/* A specialized Bar */
class SpecificBar : public SpecificFooTpl<IBar>
{
public:
    void bar() override { std::cout << "Bar!\n"; }
};

int main()
{
    SpecificFoo f;
    SpecificBar b;

    f.foo();
    b.bar();

    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++虚拟继承差异

来自分类Dev

C ++虚拟钻石继承

来自分类Dev

C ++多重和虚拟继承

来自分类Dev

C ++纯虚拟多重继承?

来自分类Dev

C#中的虚拟继承

来自分类Dev

C ++虚拟继承的晦涩用法

来自分类Dev

C ++多重和虚拟继承

来自分类Dev

无法从具有虚拟继承的类派生(C ++虚拟继承)

来自分类Dev

C ++开关与成员函数指针与虚拟继承

来自分类Dev

C ++虚拟定义是否自动继承?

来自分类Dev

C ++中的密封类和虚拟继承

来自分类Dev

虚拟继承C ++和Boost Python

来自分类Dev

C ++虚拟克隆方法,异常继承

来自分类Dev

C ++虚拟定义是否自动继承?

来自分类Dev

C ++中的虚拟继承和简单继承之间的区别

来自分类Dev

具有虚拟继承的C ++重载方法绑定

来自分类Dev

具有虚拟功能的C ++中的多重继承

来自分类Dev

没有虚拟析构函数的C ++继承

来自分类Dev

C ++中的多个虚拟继承抱怨特定的函数调用

来自分类Dev

使用C ++在虚拟继承期间调用构造函数

来自分类Dev

C中的虚拟继承示例,利用未定义的行为?

来自分类Dev

没有虚拟析构函数的C ++继承

来自分类Dev

C++中的虚拟继承,孙子对象的大小很重?

来自分类Dev

C ++虚拟继承和访问公共虚拟方法,该方法的实现在继承受保护的类中

来自分类Dev

避免重复的C ++虚拟表查找

来自分类Dev

虚拟/非虚拟继承

来自分类Dev

SWIG JAVA如何使用%interface和纯虚拟方法包装C ++多重继承

来自分类Dev

C ++开关vs.成员函数指针vs.虚拟继承

来自分类Dev

C ++多重继承,虚拟方法覆盖问题和协变返回类型