例如:
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举个例子吗?
编辑:我不是在谈论武力或语言特性,我想要的只是一个警告或任何允许我识别不受欢迎的覆盖的东西。
编辑:什么是想要的覆盖?它可以类似于以下代码:
struct A
{
virtual void go() { };
};
struct B : public A
{
virtual void go() { };
};或者:
struct A
{
virtual void go() { };
};
struct B : public A
{
void go() override { };
};或者使用属性类似的东西。
发布于 2014-07-28 16:50:08
我想你可以用标签,
#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中声明了什么。不是超级优雅,但它的工作,但我不知道你为什么真的想这样做。
https://stackoverflow.com/questions/24999461
复制相似问题