繁体   English   中英

C++ 纯虚函数的多重继承问题

[英]C++ A multiple inheritance pproblem with pure virtual functions

我已经制作了一个最小的例子来复制我看到的具有更复杂的类层次结构的问题:

#include <string>
#include <iostream>


class A
{
protected:

    virtual
    ~A() = 0;

};

inline
A::~A() {}

class B : public A
{
public:

    virtual
    ~B()
    {
    }

    std::string B_str;
};

class BB : public A
{
public:

    virtual
    ~BB()
    {
    }

    std::string BB_str;
};

class C : public A
{
protected:

    virtual
    ~C()
    {
    }

    virtual
    void Print() const = 0;
};

class D : public B, public BB, public C
{
public:

    virtual
    ~D()
    {
    }
};

class E : public C
{
public:

    void Print() const
    {
        std::cout << "E" << std::endl;
    }
};

class F : public E, public D
{
public:

    void Print_Different() const
    {
        std::cout << "Different to E" << std::endl;
    }

};


int main()
{

    F f_inst;

    return 0;
}

使用g++ --std=c++11 main.cpp编译会产生错误:

error: cannot declare variable ‘f_inst’ to be of abstract type ‘F’

    F f_inst;

note:   because the following virtual functions are pure within ‘F’:

    class F : public E, public D
          ^
note:   virtual void C::Print() const

    void Print() const = 0;
         ^

所以编译器认为Print()是纯虚拟的。

但是,我已经在class E指定了Print()应该是什么。

所以,我误解了一些继承规则。

我的误解是什么,我该如何纠正这个问题?

注意:如果我删除继承: public D from class F ,它将编译。

目前,您的F以两种不同的方式从C派生而来。 这意味着F对象有两个独立的C基础,因此有两个C::Print()实例。

您只覆盖当前通过E来的那个。

要解决此问题,您必须采用以下选项之一:

  • 还可以通过实现D::Print()F::Print()来覆盖通过D来的那个
  • 使Print不纯
  • 使用虚拟继承,以便只有一个C基础。

对于后一个选项,语法调整将是:

class E : virtual public C

class D : public B, public BB, virtual public C

这意味着DE都将具有与其父级相同的C实例,因此覆盖E::Print()覆盖该C '下游'的所有类的函数。

有关更多信息,请查找“钻石继承问题”。 另见多重继承常见问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM