作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有原始的 C++ 11 代码,它是为 Windows 开发的,可以被 MSVC 编译:
class Base
{
virtual void myFunc() throw (std::runtime_error) = 0;
};
class D1 : public Base
{
void myFunc() throw(std::runtime_error) override
{ //
throw std::runtime_error("This method is not supported in this class so we throw exeception");
}
};
class D2 : public D1
{
void myFunc() override
{
//real implementation here
}
};
代码移植到Linux,用GCC 4.9编译,报错
looser throw specifier for 'virtual void D2::myFunc()'
将 'throw()' 添加到 D2::MyFunc 可以编译代码,但它不是 MyFunc 的预期属性。
有什么方法可以让 GCC 工作吗?
最佳答案
gcc 是对的;派生类中的虚函数不能有比基类中被覆盖的函数更宽松的异常说明符。原因很清楚:如果允许这样做,调用者可以通过基类指针调用覆盖函数,因此获取函数不遵守调用它的静态类型的异常约定。
在 MSVC 上,这恰好起作用只是因为它对异常说明符的支持大大减少 - 它实际上只解析 throw()
,所有其他异常说明符都被忽略。
现在,假设除了 throw()
(又名 nothrow
)之外的异常说明符:
try
包装所有带注释的函数并调用 std: :unexpected
如果抛出任何意想不到的东西 - 甚至在 Java 风格的检查异常上,人们也广泛争论是否真的值得麻烦;你可能应该完全放弃它们,永远不要回头看。
关于c++ - 虚函数 : GCC 4. 9 的宽松抛出说明符提示但 MSVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53718066/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!