对于一个应用程序,我需要创建一组特殊的类来处理异常。我从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;
}
该代码可以编译,但是不起作用。任何想法如何解决这个问题?
这是解决钻石问题的另一种解决方案。在此解决方案中,基本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] 删除。
我来说两句