【发布时间】:2011-11-28 10:27:05
【问题描述】:
在覆盖虚拟方法时,我注意到当我在可见性方面出错(受保护的方法被覆盖为公共方法)时,编译器不会警告我。
它是有效的 C++,但通常是一个错误。
例如:
#include <iostream>
class Base
{
protected:
virtual void ProtectedMethod(void)
{
std::cout << "Base::ProtectedMethod" << std::endl;
}
};
class Derived : public Base
{
public:
virtual void ProtectedMethod(void)
{
std::cout << "Derived::ProtectedMethod" << std::endl;
}
};
int main(int, char* [])
{
Derived d;
d.ProtectedMethod();
}
我尝试使用 gcc 和 clang 以及 -Wall -Wextra 进行编译,但没有成功。 我在这段代码上运行了 CppCheck,仍然没有运气。
什么工具可以帮助我检测到这个? 我需要修复我正在开发的库的全部资源。
【问题讨论】:
-
好吧,没错。如问题所述,我承认它是完全有效的 C++。通常,这不是我想要的,因为我暴露了不应该暴露的东西。
-
是的,这不是一个错误。这只是语言允许你写的东西,尽管这可能不是作者的意图。我想,这将是那些假设的“告诉我我是否还有别的意思”警告之一。谁知道呢,也许在某些情况下,您确实希望知道派生类型的人可以访问函数,而不是只知道基类型的人。
-
这是一个很好的问题。
标签: c++ overriding virtual