我做了搜索,找不到我遇到的问题,但也许我只是不知道如何清楚地表达这个问题。
首先,我在平台上只有一个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")
使用异常的const char *重载初始化std :: runtime_error?这不会通过继承层次结构传播吗?
如果C继承B和B继承A,那么它似乎与OO原则相反,C必须知道A的实现细节。
答案 0 :(得分:1)
如果你有一个virtual
继承自基类的类,那么派生最多的类总是直接负责调用虚基类的构造函数。这是为了防止钻石继承中的问题,其中类实际上从两个类继承,每个类实际上从共享基础继承。在这种情况下,两个超类中的哪一个应该初始化基类?
请注意,在常规继承中,这不会发生。