C++ 定义C++;接口

C++ 定义C++;接口,c++,inheritance,C++,Inheritance,我在为某个类定义接口时遇到以下问题。这就是我最后一节课的样子: class msg { }; class statusmsg : public msg { }; class valuemsg : public msg { }; 现在我需要statusmsg和valuemsg类的接口,但是这些接口还需要知道msg基类的函数。我试过这样的东西 接口: class i_msg { virtual void do_something() = 0; }; class i_statusmsg

我在为某个类定义接口时遇到以下问题。这就是我最后一节课的样子:

class msg {
};

class statusmsg : public msg {
};

class valuemsg : public msg {
};
现在我需要statusmsg和valuemsg类的接口,但是这些接口还需要知道msg基类的函数。我试过这样的东西

接口:

class i_msg {
    virtual void do_something() = 0;
};

class i_statusmsg : public virtual i_msg {
    virtual void do_something_else() = 0;
};
最终类别定义:

class msg : public i_msg {
    void do_something() {
        std::cout << "foo" << std::endl;
    }
};

class statusmsg : public i_statusmsg {
    void do_something_else() {
        std::cout << "bar" << std::endl;
    }
};
class msg:public i\u msg{
空做某事{

std::cout您的statusmsg无效,因为它没有实现来自
i\u msg
的纯虚拟方法
do\u something()

要解决此问题,您可以将空方法声明放入
statusmsg
中,如下所示:

class statusmsg : public i_statusmsg {
    virtual void do_something_else();
    virtual void do_something() {};
};

正如您所做的,最后的课程应该是:

class msg : public virtual i_msg {
    void do_something() override {
        std::cout << "foo" << std::endl;
    }
};

class statusmsg : public /*virtual*/ i_statusmsg, public msg {
    void do_something_else() override {
        std::cout << "bar" << std::endl;
    }
};
class msg:public virtual i\u msg{
void do_something()覆盖{

std::cout您希望
some\u statusmsg->do\u something()
做什么?您还可以通过实现继承的do\u something()方法来实现它。必需。
class msg : public virtual i_msg {
    void do_something() override {
        std::cout << "foo" << std::endl;
    }
};

class statusmsg : public /*virtual*/ i_statusmsg, public msg {
    void do_something_else() override {
        std::cout << "bar" << std::endl;
    }
};