Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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 - Fatal编程技术网

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

C++ C++;纯虚函数的多重继承问题,c++,inheritance,C++,Inheritance,我制作了一个简单的示例,以复制我在更复杂的类层次结构中看到的问题: #include <string> #include <iostream> class A { protected: virtual ~A() = 0; }; inline A::~A() {} class B : public A { public: virtual ~B() { } std::string B_str; }; c

我制作了一个简单的示例,以复制我在更复杂的类层次结构中看到的问题:

#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;
}
因此编译器认为
Print()
是纯虚拟的

但是,我已经指定了
Print()
应该在
类E
中的内容

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

我的误解是什么?我怎样才能纠正这个问题


注意:如果我从
class F
中删除继承
:public D
,它将编译。当前,您的
F
以两种不同的方式派生自
C
。这意味着一个
F
对象有两个独立的
C
基,因此有两个
C::Print()
实例

您当前仅覆盖通过
E
来的一个

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

  • 也可以通过实现
    D::Print()
    F::Print()
    来覆盖通过
    D
    来实现的
  • 使
    打印
    非纯
  • 使用虚拟继承,以便只有一个
    C
对于后一个选项,语法调整将是:

class E : virtual public C

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


有关更多信息,请查阅“菱形继承问题”。另请参见

F
也派生自
D
D
派生自
C
C
实例中的
C::Print
未被覆盖。一个选项是使用虚拟继承,这意味着
F
只有一个
C
祖先,而
D
E
共享
C
库。搜索术语是“菱形继承问题”@M
classd
将用作基类指针向量的抽象基类。我无法在
class D
中实现函数
Print()
。我该怎么办?另一个选项是覆盖
F
中的
Print
(实现可能是调用
E::Print();
)我尝试用
virtual
继承
类D
,但这没有帮助。。。?
class E : virtual public C
class D : public B, public BB, virtual public C