为什么孙子类的父级不处理祖父母类的初始化?

时间:2016-07-01 21:50:06

标签: c++ inheritance exception-handling virtual-inheritance

我做了搜索,找不到我遇到的问题,但也许我只是不知道如何清楚地表达这个问题。

首先,我在平台上只有一个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的实现细节。

1 个答案:

答案 0 :(得分:1)

如果你有一个virtual继承自基类的类,那么派生最多的类总是直接负责调用虚基类的构造函数。这是为了防止钻石继承中的问题,其中类实际上从两个类继承,每个类实际上从共享基础继承。在这种情况下,两个超类中的哪一个应该初始化基类?

请注意,在常规继承中,这不会发生。