为什么孙类的父类不处理祖父类的初始化?
Why doesn't a grandchild class's parent handle the initialization of the grandparent class?
我做了搜索,找不到我遇到的问题,但也许我只是不知道如何清楚地表达这个问题。
首先,我在问题平台上只有一个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
直接从基类继承的类,那么最派生的类总是直接负责调用虚拟基类的构造函数。这是为了防止菱形继承中的问题,在菱形继承中,一个类实际上继承了两个类,而这两个类实际上都继承了一个共享基。在这种情况下,两个超类中的哪一个应该初始化基类?
注意,在常规继承中,这不会发生。
相关文章:
- C++类 - 初始化列表 - 递归 - 按值传递
- 何时为派生类初始化 vptr?
- 虚拟基类初始化
- 类初始化中的静态 lambda
- 使用父类实例化的向下转换对象
- C++ 使用向量进行类初始化
- 您可以在类初始化器列表中定义数组大小吗?
- C++11 成员类初始化顺序
- 大括号使用枚举类初始化静态常量unordered_map
- 类初始化中的指针初始化
- Arduino 类初始化执行
- 为什么我们需要模板 <int N>,因为我们有类初始化
- 如何将指针声明以在类初始化器中的成员功能并拨打这些指针
- 如何防止在基类初始化器中调用默认构造函数?
- 为什么"new"在类初始化中失败
- 从模板类初始化对象时出错.参考类模板实例化
- 如何将断言放在类初始化列表之前
- 使用不同的类初始化对象
- 类初始化的const参考
- C++:我们应该从父类初始化类还是直接调用类