是否可以阻止成员函数被重新定义
Is it possible to prevent a member function from being redefined?
我希望类B不能重新定义基类a的一个成员函数。有办法做到这一点吗?
编辑:
谢谢你的回答。我可以防止非虚拟成员函数也被覆盖吗?
如果您的意思是不允许派生类覆盖其基类的虚拟函数,C++11引入了一种使用final
virt说明符(标准中称之为)的方法:
struct B{
virtual void f() final;
};
struct D : B{
void f(); // error: 'B::f' marked 'final'
};
不过,我不知道哪些编译器支持这一点。可能是GCC 4.7和Clang。
如果您的方法是virtual
,那么在C++11中,您可以防止用final
重写它们。
class A
{
public:
virtual void foo() final;
};
class B : public A
{
public:
void foo(); // <-- error
};
你无法阻止躲藏。
我可以防止非虚拟成员函数被重写为好
不,你不能,但从另一方面来说,你可以。。。如果你不在岸上,你是否会在派生类中实际覆盖基方法,你可以检查你是否覆盖了一个方法,或者是否使用了override
键
当把这个keywod应用到你的方法中时,你会让你真正想要的shore覆盖这个方法。
因此,如果内部方法的签名与基方法的签名相同,则会出现编译时错误,比如派生方法不覆盖基方法。
因此使用override
关键字是在告诉编译器您不想遍历它。如果不使用override键wo,您永远不知道是否覆盖它。
考虑以下示例:
class A
{
public:
void f() {std::cout << "A";}
};
class B : public A
{
public:
void f() override {std::cout << "B";}
};
这会导致编译时错误,因为您无法重写基方法。通过不使用override关键字,您当然可以覆盖它。
override keywod是在C++0x标准中引入的,并得到visual studio 2010的支持。
相关文章:
- 定义C++新的环境变量并在 bat 文件中使用它
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 从使用概念定义的函数返回新对象
- 如何在C++中为 if 和 else 语句定义新行为
- 如何从 C++ 中的现有模板函数定义新函数
- 自定义分配器,包括放置新案例
- 正在通过const-ref未定义的行为捕获新构造的对象
- 如何在CPropertySheet中定义新颜色
- 谁定义新操作员
- 未定义的符号'fixed_address_empty_string':带有protobuf的新张量流运算
- 新的C ,未定义的参考
- boost :: fibonacci_heap:带有比较器重新定义圆形定义错误的嵌套定义
- 宏,用于定义带有添加前缀的新宏
- 取消脱壳:使用模板在多行类型定义中添加一个尖括号后的新行
- C 通过Typedef定义新类型
- 通过在此指针上放置新位置重新初始化对象时未定义的行为
- 在 ss.clear() 之后使用 ss.str( " ") 用于新定义的字符串流
- Eclipse CDT将方法定义定义到标头文件
- 是标头文件中使用“新”定义的成员指针泄漏
- LEX 程序中的未定义定义