[C++ private and protected virtual method](https://stackoverflow.com/questions/14670612/c-private-and-protected-virtual-method) and [Is there any valid reason for not using public virtual methods?](https://stackoverflow.com/questions/22602672/is-there-any-valid-reason-for-not-using-public-virtual-methods) are talking about Non-Virtual Interface (**NVI**) and non-public virtual function and their symbiosis. Scott Meyers also says in Effective C++ that

> 
> Sometimes a virtual function even has to be public, but then the NVI idiom can't really be applied.
> 
> 
> 

What I failed to see is why NVI *requires* that the implementation specific virtual function(s) be non-public? From Herb Sutter's article [Virtuality](http://www.gotw.ca/publications/mill18.htm), it is saying that it is a good practice to follow, e.g., it is good to separate public (client) interface from the implementation details (the non-public interface). What I want to know is if there is any language feature I missed that semantically prevents NVI being applied if such virtual functions are declared public?

For example:

```
class Engine
{
public:
    void SetState( int var, bool val );
    {   SetStateBool( int var, bool val ); }

    void SetState( int var, int val );
    {   SetStateInt( int var, int val ); }
private:
    virtual void SetStateBool(int var, bool val ) = 0;    
    virtual void SetStateInt(int var, int val ) = 0;    
};

```

What are the effects if I put `SetStateBool` and `SetStateInt` in public section of the class definition?