首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可能认识到虚拟函数的不受欢迎的覆盖?

是否有可能认识到虚拟函数的不受欢迎的覆盖?
EN

Stack Overflow用户
提问于 2014-07-28 16:10:30
回答 1查看 118关注 0票数 3

例如:

代码语言:javascript
复制
struct A
{
    virtual void go() { };
};

struct B : public A
{
    void go() { };
};

函数go的隐式重写可能是不可取的,因为无法识别B::go()隐藏或重写了struct A的相同函数,甚至可能是结构A中不存在的新函数。当您想要对虚拟函数进行理想的重写时,C++11的C++11特性是有用的,但在我的示例中,它是不可取的,而且我不想重写函数go(),这意味着如果我知道有一个虚拟函数,我就不会在struct B中将它放在override中。

我想要的是类似于[名称]属性提案而不是C++11的东西,C++有它的语言特性吗?

顺便说一句,编译器(比如GCC和VC++)有一个选项来显示警告(如果错误不可用的话,警告就足够了!)如果发生了虚拟函数的隐式重写?如果有,你能给GCC举个例子吗?

编辑:我不是在谈论武力或语言特性,我想要的只是一个警告或任何允许我识别不受欢迎的覆盖的东西。

编辑:什么是想要的覆盖?它可以类似于以下代码:

代码语言:javascript
复制
struct A
{
    virtual void go() { };
};

struct B : public A
{
    virtual void go() { };
};

或者:

代码语言:javascript
复制
struct A
{
    virtual void go() { };
};

struct B : public A
{
    void go() override { };
};

或者使用属性类似的东西。

EN

回答 1

Stack Overflow用户

发布于 2014-07-28 16:50:08

我想你可以用标签,

代码语言:javascript
复制
#include <iostream>
#include <memory>

using namespace std;

struct no_override_tag
{};

struct A
{
    virtual void go() { cout <<"A::go" << endl;};
};

struct B : public A
{
    void go(no_override_tag={}) { cout << "B::go" <<endl; };
};

int main()
{
    unique_ptr<A> upA(new B);
    upA->go(); // no override, calls `A::go()` instead of `B::go()`


}

基本上,您在no_override_tag中添加一个默认初始化参数作为B::go()中的最后一个参数,这将使B::go的签名有所不同,不管您在A中声明了什么。不是超级优雅,但它的工作,但我不知道你为什么真的想这样做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24999461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档