【发布时间】:2016-11-04 09:21:12
【问题描述】:
我进行了搜索,但找不到我遇到的问题,但也许我只是不知道如何清楚地表达这个问题。
首先,我在相关平台上只有一个 C++98 编译器,所以如果您在回复时请记住这一点,我将不胜感激。
让我举个例子和我得到的错误信息:
namespace mal {
struct Exception : virtual std::runtime_error {
Exception(): std::runtime_error("mal exception") {}
explicit Exception(const char* msg): std::runtime_error(std::string(msg?msg:"")) {}
explicit Exception(const std::string& msg): std::runtime_error(msg) {}
virtual ~Exception() throw() {}
}; // Exception struct
struct OpenException : virtual Exception {
OpenException(): Exception("mal open error") {}
}; // OpenException struct
}; // mal namespace
我收到以下错误:
malt.cpp: In constructor ‘mal::OpenException::OpenException()’:
malt.cpp:18: error: no matching function for call to ‘std::runtime_error::runtime_error()’
OpenException 继承 Exception,后者继承 std::runtime_error 并将其初始化为字符串。为什么OpenException初始化语句Exception("mal open error")不使用Exception的const char*重载来初始化std::runtime_error?这不会通过继承层次结构向上传播吗?
如果 C 继承 B,B 继承 A,C 必须了解 A 的实现细节,这似乎与 OO 原则背道而驰。
【问题讨论】:
-
@RSahu 好的,谢谢。我的问题真的与多重继承无关,所以我希望你能把我的“重复”留在这里,以防有人遇到和我一样的问题。我的问题是由虚拟继承引起的;但是,在不知道这一点的情况下,我不会制定一个好的搜索字符串来找到您确定为重复的解决方案。
-
当然。我没有对你的帖子做任何其他事情。
标签: c++ inheritance exception-handling virtual-inheritance