【问题标题】:How to be warned when overriding a virtual method with wrong visibility覆盖具有错误可见性的虚拟方法时如何被警告
【发布时间】: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


【解决方案1】:

我使用ctags找到了满足我需求的解决方案。

CTags 可以解析 C++ 并将信息转储到文件中。

使用以下选项:

$CTAGS -f $TAGFILE --fields=fkstia --c++-kinds=+p  -R $SOURCES

我可以以易于解析的格式获取所有需要的信息。

通过几个grep 命令对$TAGFILE 进行管道传输,我可以验证已知函数名称是否具有预期的可见性,否则会对相关文件发出警告。

这是一个 bash sn-p 从 ctags 输出中提取信息:

#!/bin/bash
function check_method {
    echo "Checking $1 (should be $2 and is not)"
    cat $TAGFILE | grep "^$1    " | grep "access" | grep -v "access:$2" | cut -f 2
    echo
}

# will warn anytime a method called ProtectedMethod is not protected
check_method ProtectedMethod protected

【讨论】:

    【解决方案2】:

    Inspirel 让您可以定义自己的规则:http://www.inspirel.com/vera/

    【讨论】:

      猜你喜欢
      • 2018-04-22
      • 2020-01-22
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 2016-01-24
      相关资源
      最近更新 更多