C ++通过接口使用从其他几个继承的类

问题描述 投票:2回答:1

我正在学习C ++,并且对多重继承和接口类感到困惑。

我想拥有一个从其他几个继承的类。另外,我想通过接口使用该派生类。所以我想,派生类应该扩展基类,派生接口应该扩展基接口。我本来可以用其他语言完成的,但是我认为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;
}

这是我得到的编译器错误:

src/test.cpp: In function ‘int main()’:
src/test.cpp:49:30: error: invalid new-expression of abstract class type ‘Derived’
  DerivedItf* d = new Derived();
                              ^
src/test.cpp:35:2: note:   because the following virtual functions are pure within ‘Derived’:
  Derived
  ^~~~~~~
src/test.cpp:10:16: note:       virtual void Base1Itf::blue()
   virtual void blue() = 0;
                ^~~~

在该示例中,仅实现了一个基类,但还会有更多的基类。

我做错了什么?谢谢。


编辑

如果为了避免钻石问题而删除了Base1Itf的Base1Abs继承,则编译器会显示相同的错误。

c++ inheritance interface multiple-inheritance
1个回答
0
投票

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

#include <iostream>

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

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

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

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

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

int main()
{
    Derived* d = new Derived();
    d->red();
    d->blue();
    delete d;
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.