多重继承:不能实例化抽象类

Dav*_*vid 3 c++ base-class c++17

我有这个:

class Base {
public:
    Base() {};
    virtual ~Base() = default;

    virtual void Draw() = 0;
};

class Derived_1 {
public:
    Derived_1() {};
    void Draw() { std::cout << "Draw()" << std::endl; };
};

class Derived_2 : public Base, public Derived_1 {
public:
    Derived_2() {};
    ~Derived_2() {};        

    //void Draw() { Derived_1::Draw(); }; <<<<<===--- This works well
};

class Derived_3 : public Derived_2 {
public:
    Derived_3() {};
    ~Derived_3() {};        
};

int main()
{
    Base* d = new Derived_3();
    d->Draw();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到了一个错误,比如“纯虚函数“Base::Draw”没有覆盖”。我认为问题是 Derived_2 有两个 Draw() 函数,其中一个是虚拟的。但是,我不知道如何在 Derived_2 类中添加包装函数 Draw() 来解决这个问题。是否可以?

Adr*_*ica 5

当你给你的Derived_2类多重继承(即它从Base 派生Derived_1)时,你是说它从两个基类继承了成员函数。

在这种情况下,这意味着它有两个(不同的)Draw成员具有相同的签名。因此,纯虚Draw衍生自功能Base不会由衍生自被重写Derived_1

事实上,如果你按照建议使用Derived_3* d = new Derived_3();代替你的第一行main(),你仍然会得到“无法实例化抽象类”错误,再加上另一个类似“Draw() 的错误访问”的错误。

void Draw() { Derived_1::Draw(); };Derived_2类中注释掉的行做了两件事:(1)它解决了以后任何Draw()来自Derived_2类的调用中的歧义;(2) 它提供了DrawBase类的纯虚函数的可行覆盖。