C++;通过接口使用从其他几个类继承的类 我学习C++,我对多重继承和接口类感到困惑。

C++;通过接口使用从其他几个类继承的类 我学习C++,我对多重继承和接口类感到困惑。,c++,inheritance,interface,multiple-inheritance,C++,Inheritance,Interface,Multiple Inheritance,我想要一个从其他几个类继承的类。此外,我希望通过接口使用该派生类。所以我想,派生类应该扩展基类,派生接口应该扩展基类接口。我会用其他语言来做这件事,但是我认为C++没有这样的工作。 这是我认为应该有效的代码: #include <iostream> using std::cout; using std::endl; class Base1Itf { public: virtual void blue() = 0; }; class Bas

我想要一个从其他几个类继承的类。此外,我希望通过接口使用该派生类。所以我想,派生类应该扩展基类,派生接口应该扩展基类接口。我会用其他语言来做这件事,但是我认为C++没有这样的工作。 这是我认为应该有效的代码:

#include <iostream>

using std::cout;
using std::endl;

class
    Base1Itf
{
    public:
        virtual void blue() = 0;
};

class
    Base1Abs
:
    public Base1Itf
{
    public:
        void blue()
        {
            cout << "blue" << endl;
        }
};

class
    DerivedItf
:
    public Base1Itf
{
    public:
        virtual void red() = 0;
};

class
    Derived
:
    public Base1Abs,
    public DerivedItf
{
    public:
        void red()
        {
            cout << "red" << endl;
        }
};

int main()
{
    DerivedItf* d = new Derived();
    d->red();
    d->blue();
    delete d;
    return 0;
}
在本例中,只实现了一个基类,但还将实现更多的基类

我做错了什么?多谢各位


编辑


如果删除Base1ITF的BASE1ABS继承,以避免菱形问题,编译器显示相同的错误。

< P>这是C++中众所周知的钻石问题。这就是解决问题的方法:

#include <iostream>

using std::cout;
using std::endl;

class Base1Itf {
public:
    virtual void blue() = 0;
    virtual ~Base1Itf() { }
};

class Base1Abs : virtual public Base1Itf {
public:
    void blue() override {
        cout << "blue" << endl;
    }
    virtual ~Base1Abs() { }
};

class DerivedItf : virtual public Base1Itf {
public:
    virtual void red() = 0;
    virtual ~DerivedItf() { }
};

class Derived : public Base1Abs, public DerivedItf {
public:
    void red() override {
        cout << "red" << endl;
    }
    virtual ~Derived() { }
};

int main() {
    DerivedItf* d = new Derived();
    d->red();
    d->blue();
    delete d;
    return 0;
}
#包括
使用std::cout;
使用std::endl;
类Base1Itf{
公众:
虚空蓝()=0;
虚拟~Base1Itf(){}
};
Base1Abs类:虚拟公共Base1Itf{
公众:
void blue()覆盖{

Cuth

这是C++中众所周知的钻石问题。这就是你如何解决它:

#include <iostream>

using std::cout;
using std::endl;

class Base1Itf {
public:
    virtual void blue() = 0;
    virtual ~Base1Itf() { }
};

class Base1Abs : virtual public Base1Itf {
public:
    void blue() override {
        cout << "blue" << endl;
    }
    virtual ~Base1Abs() { }
};

class DerivedItf : virtual public Base1Itf {
public:
    virtual void red() = 0;
    virtual ~DerivedItf() { }
};

class Derived : public Base1Abs, public DerivedItf {
public:
    void red() override {
        cout << "red" << endl;
    }
    virtual ~Derived() { }
};

int main() {
    DerivedItf* d = new Derived();
    d->red();
    d->blue();
    delete d;
    return 0;
}
#包括
使用std::cout;
使用std::endl;
类Base1Itf{
公众:
虚空蓝()=0;
虚拟~Base1Itf(){}
};
Base1Abs类:虚拟公共Base1Itf{
公众:
void blue()覆盖{

您不能创建带有@d4rk4ng31的类的对象吗?是的,通过阅读编译器错误,我知道这一点。但如果可能的话,我不知道如何执行我正在尝试的操作。@d4rk4ng31是的,我知道,但正如标题所述,我想通过接口使用派生类。您必须实现
blue()
Derived
中。相关:您无法使用@d4rk4ng31创建类的对象。是的,我通过阅读编译器错误知道。但我不知道如何执行我正在尝试的操作,如果可能的话。@d4rk4ng31是的,我知道,但正如标题所述,我希望通过接口使用派生类。您必须实现
blue()
派生的
中相关:一些关于虚拟继承的有趣读物:@JoanBotella,从维基百科以外的任何地方学习……相信我,我是根据经验说话的……我想首先推荐一些关于虚拟继承的有趣读物:@JoanBotella,从维基百科以外的任何地方学习迪亚…相信我,我是凭经验说话的…我会给初学者一些建议