Roe*_*rel 6 c++ virtual inheritance c++-cli
情况就是这样.
class Interface
{
public:
virtual void foo() = 0;
}
class MyClass : Interface
{
public:
virtual void bar() = 0;
private:
void foo()
{
//Some private work and checks.
bar();
};
}
Run Code Online (Sandbox Code Playgroud)
我希望我的用户将创建一个继承自MyClass的类,他们必须在那里实现bar()
.
但是我怎么能阻止他们不会覆盖foo()
呢?因为使用我的重要性对我来说很重要foo()
.
Bjö*_*lex 13
在C++ 11中,您可以将方法标记为final
阻止它被覆盖:
class MyClass : Interface
{
public:
virtual void bar() = 0;
private:
void foo() final
{
//Some private work and checks.
bar();
};
}
Run Code Online (Sandbox Code Playgroud)
根据其他答案,您可以final
在C++ 11中使用关键字(此类工具类似于Java的final
关键字).
对于C++ 03代码,您可以使用CRTP机制(如果您可以更改定义,则提供Interface
)
template<typename Derived>
class Interface
{
public:
void foo() // not 'virtual'
{
static_cast<Derived*>(this)->foo();
}
}
class MyClass : public Interface<MyClass>
{
public:
virtual void bar() = 0;
private:
void foo()
{
//Some private work and checks.
bar();
};
}
Run Code Online (Sandbox Code Playgroud)
所以现在你已经删除了它virtual
,foo()
并且绑定将在编译时发生.请记住,CRTP有自己的限制,因此是否使用它取决于您.