gpt4 book ai didi

c++ - 异常是否需要虚拟继承?

转载 作者:可可西里 更新时间:2023-11-01 15:45:56 26 4
gpt4 key购买 nike

我理解在使用多重继承时需要虚拟继承——它解决了可怕的菱形继承(钻石问题)。

但是如果我不使用多重继承呢? 是否需要虚拟继承?

我似乎记得听说它对异常很重要(抛出派生类,通过基类引用捕获)。但是,虚拟析构函数是否足以满足此要求?

我已经尝试搜索我曾经在这方面看到的引用页面,但我似乎找不到它。

最佳答案

您可能正在考虑这个 Boost.Exception guideline ,为了完整起见,我将在此处复制:


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

异常类型在从其他异常类型派生时应该使用虚拟继承。这一见解归功于 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; }
}

上面的程序输出“whoops!”因为转换为 std::exception 是不明确的。

虚拟继承引入的开销在异常处理的上下文中总是可以忽略不计。请注意,虚拟基类由最派生类型(传递给 throw 语句的类型,以防异常)的构造函数直接初始化。但是,通常在 boost::exception 时不关心此细节。使用,因为它使异常类型成为没有成员的普通结构(没有什么要初始化的。)See Exception Types as Simple Semantic Tags .

关于c++ - 异常是否需要虚拟继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5874255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com