我希望B类不能重新定义其基类A的成员函数之一。有没有办法做到这一点?
修改
感谢您的回答。我是否可以阻止非虚拟成员函数被覆盖?
答案 0 :(得分:3)
如果您的意思是禁止派生类覆盖其基类的虚函数,C ++ 11引入了一种方法来使用final
virt-specifier来实现(正如标准中所说):
struct B{
virtual void f() final;
};
struct D : B{
void f(); // error: 'B::f' marked 'final'
};
但是,我不知道哪些编译器支持这一点。可能是GCC 4.7和Clang。
答案 1 :(得分:2)
如果您的方法是virtual
,则在C ++ 11中,您可以阻止使用final
覆盖它们。
class A
{
public:
virtual void foo() final;
};
class B : public A
{
public:
void foo(); // <-- error
};
你无法阻止隐藏。
答案 2 :(得分:0)
我可以阻止非虚拟成员函数被覆盖吗? 好?
不,你不能,但是从另一方面你可以......如果你没有支持,如果你在你的派生类中你是否会覆盖基本方法,你可以检查你是否覆盖了一个方法或者没有使用关键词override
将keywod应用于您的方法时,您可能会想要覆盖该方法。
所以如果inherted方法的签名与基本方法的签名相同,你将得到编译时错误,比如派生方法不会覆盖基本方法。
所以使用override
关键字,告诉编译器你不想要永远。
通过不使用覆盖键你永远不知道你是否覆盖它。
考虑以下示例:
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的支持。