定义C ++接口

时间:2014-01-07 10:10:58

标签: 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 : 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;
    }
};

现在我无法创建statusmsg的实例,因为编译器告诉我没有实现do_something()。有没有办法让这个工作?

提前致谢。

好的,我找到了一个解决方案,问题是在继承时正确放置虚拟关键字。以下是示例代码:

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

class i_statusmsg : public virtual i_msg {
public:
    virtual void do_something_else() = 0;
};

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

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

2 个答案:

答案 0 :(得分:1)

您的statusmsg无效,因为它未实现do_something()中的纯虚方法i_msg

为了解决这个问题,您可以将空方法声明放入statusmsg,如下所示:

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

答案 1 :(得分:1)

正如您所做的那样,最终的课程应该是:

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

但似乎你必须重新考虑你的设计以避免多重继承。