多重继承:无法实例化抽象类

问题描述 投票:3回答:4

我有这个:

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;
}

我收到类似“纯虚函数“ Base :: Draw”没有替代程序”的错误。我认为问题在于Derived_2具有两个Draw()函数,其中之一是虚拟的。但是,我不知道如何在未在Derived_2类中添加包装函数Draw()的情况下解决此问题。有可能吗?

c++ c++17 base-class
4个回答
5
投票

[当您赋予Derived_2类多个继承(即,它继承自Base Derived_1时)时,您是说它继承了both基类的成员函数。] >

在这种情况下,这意味着它具有两个(不同的)Draw成员具有相同的签名。因此,从Draw派生的纯虚拟Base函数将not

被从Derived_1派生的函数覆盖。

实际上,如果按照建议使用Derived_3* d = new Derived_3();代替第一行main(),您仍然会收到“无法使抽象类错误”错误,以及“绘制错误地访问Draw”的另一行()“。

您的注释行,void Draw() { Derived_1::Draw(); };类中的Derived_2做两件事:(1)解决了以后从Draw()类对Derived_2的任何调用中的歧义; (2)它提供了对Draw类的纯虚拟Base函数的可行替代。


2
投票

这两个Draw功能是不同的,尽管名称和签名相似。他们也可以有两个不同的名字。 BaseDerived_1无关,因此Derived_1Draw无法覆盖Base的。


1
投票

我认为您的问题是,您将d定义为“ Base”类,而不是“ Derived_3”类,因此,即使您使用了metadata_3构造函数,编译器仍会在“ Base”下寻找draw的定义。


0
投票

您有2个具有相同名称和参数的函数,这永远都不好。请尝试更改Draw()函数之一的名称,或者,如果您确实想要相同的名称,请使Derived_1继承自Base

© www.soinside.com 2019 - 2024. All rights reserved.