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

Why doesn't a grandchild class's parent handle the initialization of the grandparent class?

本文关键字:父类 初始化 孙类 为什么 处理      更新时间:2023-10-16

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

首先,我在问题平台上只有一个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")不初始化std::runtime_error使用const char*重载异常?这不会通过继承层次结构向上传播吗?

如果C继承了B, B继承了A,那么C必须知道A的实现细节似乎是违背OO原则的。

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

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