安全地删除C++隐藏的虚拟警告

Com*_* 10 3 c++ virtual static-assert

我从Sun C++ 5.10编译器那里得到一个关于我正在改变的一些现有代码中的隐藏虚拟方法的编译警告.无论出于何种原因,作者都没有为给定的数据类型实现函数的覆盖.我在这里重新创建了这种情况:

// First the data types
struct Shape {};
struct Square : public Shape {};
struct Circle : public Shape {};
struct Triangle : public Shape {};

// Now the visitor classes
struct Virtual
{   
    virtual ~Virtual() {}

    virtual void visit( Square& obj ) {}
    virtual void visit( Circle& obj ) {}
    virtual void visit( Triangle& obj ) {}
};

struct Concrete : public Virtual
{   
    void visit( Square& obj ) {}
    void visit( Circle& obj ) {}
};

int main()
{   
    Concrete myConcrete;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Concrete类没有实现void visit( Triangle& obj ) {},这是导致出现以下错误信息:

"pv_block.cpp", line 20: Warning: Concrete::visit hides the virtual function
Virtual::visit(Triangle&).
Run Code Online (Sandbox Code Playgroud)

代码工作正常,但删除此警告消息将是很好的.因此,我希望实现该功能,以便编译器满足但不能使用 - 最好在编译时检测 - 因为目前显然不需要.

有没有办法实现编译断言以允许编译但阻止使用?我无法访问Boost或C++ 11.

Rei*_*ica 5

你为什么要阻止使用?即使您(以某种方式)确实阻止它,以便以下(A)无法编译:

Triangle t;
Concrete x;
x.visit(t);
Run Code Online (Sandbox Code Playgroud)

以下(B)仍然有效:

Triangle t;
Concrete x;
static_cast<Virtual&>(x).visit(t);
Run Code Online (Sandbox Code Playgroud)

所以IMO,试图阻止它被调用是没有意义的.我会通过在类中添加using声明来解决警告Concrete,如下所示:

struct Concrete : public Virtual
{ 
    using Virtual::visit;
    void visit( Square& obj ) {}
    void visit( Circle& obj ) {}
};
Run Code Online (Sandbox Code Playgroud)

这将使警告静音,并启用(A).但我不认为在这种情况下启用(A)是错误的.