异常需要虚拟继承吗?

Tim*_*Tim 10 c++ exception-handling virtual-inheritance

我理解在使用多重继承时需要虚拟继承 - 它解决了Dreaded Diamond问题.

但是,如果我不使用多重继承怎么办? 是否需要虚拟继承?

我似乎记得听说它对异常很重要(抛出派生类,通过基类引用捕获).但虚拟析构函数不应该足够吗?

我已经尝试过搜索我曾经看过的参考页面,但我似乎无法找到它.

GMa*_*ckG 17

你可能正在考虑这个Boost.Exception指南,为了完整起见我将在这里复制:


在异常类型中使用虚拟继承

从其他异常类型派生时,异常类型应使用虚拟继承.这种见解归功于Andrew Koenig.使用虚拟继承可以防止异常处理程序中出现歧义问题:

#include <iostream>
struct my_exc1 : std::exception { char const* what() const throw(); };
struct my_exc2 : std::exception { char const* what() const throw(); };
struct your_exc3 : my_exc1, my_exc2 {};

int
main()
    {
    try { throw your_exc3(); }
    catch(std::exception const& e) {}
    catch(...) { std::cout << "whoops!" << std::endl; }
    }
Run Code Online (Sandbox Code Playgroud)

上面的程序输出"哎呀!" 因为转换为std :: exception是不明确的.

在异常处理的上下文中,虚拟继承引入的开销总是可以忽略不计.请注意,虚拟基础由最派生类型的构造函数直接初始化(在异常的情况下传递给throw语句的类型.)但是,当使用boost :: exception时,通常这个细节无关紧要,因为它使异常类型成为没有成员的简单结构(没有什么可以初始化.)将异常类型视为简单语义标记.