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

标签 c++ inheritance exception 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,Exception继承std::runtime_error并初始化为字符串。为什么 OpenException 初始化语句 Exception("mal open error") 不使用 Exception 的 const char* 重载来初始化 std::runtime_error?这不会通过继承层次向上传播吗?

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

最佳答案

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

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

关于c++ - 为什么孙类的父类不处理祖类的初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38154287/

相关文章:

不同文件中的 C++ 类问题

c++ - 在执行过程中将 callgrind/valgrind 附加到程序

java - 方法不返回给用户(继承)

c++ - 捕获子类内部的变量?

node.js - Visual Studio 2017 Node.js 异常不起作用

c# - .NET 异常的正确使用

C# 相当于 AtlEscapeUrl

c++ - 当一个功能完成另一个功能打开时我该怎么办?

java - 类继承 : generic extends generic

c# - InvalidDataContractException 是无效的集合类型,因为它具有 DataContractAttribute