我在为某个类定义接口时遇到以下问题。这就是我的最终课程的样子:
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;
}
};
答案 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;
}
};
但似乎你必须重新考虑你的设计以避免多重继承。