簡體   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