模棱两可的虚拟继承

Amirhessam

对于一个应用程序,我需要创建一组特殊的类来处理异常。我从std :: exception派生了我的基类。但是,我最终遇到了钻石问题和模棱两可的继承问题。即使使用虚拟继承也无济于事。下面的示例演示了该问题。

#include <iostream>

class Exception:
    public virtual std::exception
{
public:
    Exception():
        std::exception("This is default")
    {        
        std::cout << "This is Exception\n";
    } 
};

class ChildException:
    public virtual std::runtime_error,
    public Exception

{
public:
    ChildException():
        Exception(),
        std::runtime_error("hello")
    {
        std::cout << "This is ChildException\n";
    }
};
int main() 
{
    ChildException exc();    
    //std::cout << static_cast<std::exception> (exc).what() << std::endl;
    //std::cout << static_cast<std::runtime_error> (exc).what() << std::endl;    
    getchar();
    return 0;
}

该代码可以编译,但是不起作用。任何想法如何解决这个问题?

Amirhessam

这是解决钻石问题的另一种解决方案。在此解决方案中,基本Exception类不是从std :: exception派生的。相反,它包含一个指向std :: exception的指针。另外,它具有两个转换器函数,可使用其指针将Exception转换为std :: exception。派生类使用std :: runtime_error初始化指针。使用这种方法,可以解决歧义性,并且可以将ChildException对象捕获为std :: exception或std :: runtime_error。

#include <iostream>

class Exception
{
public:    
    explicit Exception()
    {  
        pSTDException = nullptr;
    }
    operator std::exception*()
    {
        return pSTDException;
    }
    operator std::exception()
    {
        return * pSTDException;
    }
    std::exception * pSTDException;
};

class ChildException:
    public std::runtime_error,
    public Exception

{
public:
    ChildException():        
        std::runtime_error("This is ChildException")
    {        
        this->pSTDException = static_cast<std::exception *>(static_cast<std::runtime_error *>(this));        
    }    
};
int main() 
{    
    try
    {        
        throw ChildException();
    }    
    catch(std::exception & e)
    {
        std::cout << e.what();
    }
    getchar();
    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

多继承模棱两可的基类

来自分类Dev

从Object继承的方法变得模棱两可

来自分类Dev

Qt:继承导致模棱两可

来自分类Dev

C ++ typedef继承模棱两可的问题

来自分类Dev

C ++继承错误:模棱两可的错误

来自分类Dev

枚举类模棱两可的继承

来自分类Dev

对继承的模板方法的模棱两可的调用

来自分类Dev

模棱两可的外部联接?

来自分类Dev

模棱两可的varargs方法

来自分类Dev

解决模棱两可的模板

来自分类Dev

For循环增强,但模棱两可

来自分类Dev

gdiplus成员是模棱两可的

来自分类Dev

Java ==行为模棱两可

来自分类Dev

附加使用模棱两可?

来自分类Dev

SimpleDateFormat模棱两可的匹配

来自分类Dev

模棱两可的进入系统

来自分类Dev

引用valueOf模棱两可

来自分类Dev

Extensiong模棱两可的错误

来自分类Dev

Extensiong模棱两可的错误

来自分类Dev

SimpleDateFormat模棱两可的匹配

来自分类Dev

将模棱两可的CFG转换为模棱两可的CFG

来自分类Dev

困惑于将模棱两可的语法转换为模棱两可的语法

来自分类Dev

无功能覆盖的多重继承。为什么模棱两可

来自分类Dev

模棱两可的错误:C ++ 11使用可变参数模板多重继承

来自分类Dev

模棱两可的错误:C ++ 11使用可变参数模板多重继承

来自分类Dev

无功能覆盖的多重继承。为什么模棱两可

来自分类Dev

解析模棱两可的时间戳

来自分类Dev

Maven的组装插件抛出模棱两可的NullPointerException

来自分类Dev

错误:对重载函数的模棱两可的调用