Zapobieganie nadpisywaniu i / lub ukrywanie funkcji klasy bazowej (C ++ 11)

Chciałem przez jakiś czas zapobiec nawet ukrywaniu funkcji nie-wirtualnej klasy bazowej, odkąd nauczyłem się C ++ i nie jestem pewien, czy byłoby to etyczne, ale funkcje C ++ 11 dały mi pomysł. Załóżmy, że mam następujące:

bases.h ....

#ifndef baseexample_h
#define baseexample_h

#include <iostream>

class Base{
    public:  
    void foo() {
        std::cout << "Base.foo()\n" << std::endl;
    }
};

class Derived: public Base{ 
    public:
    void foo(){
        std::cout << "Derived.foo()\n" << std::endl;
    }   
};

#endif

i main.cpp ...

#include "bases.h"
#include <iostream>

int main()
{

    Base base;
    Derived derived; 

    base.foo();
    derived.foo();

    std::cin.get();

    return 0;
};

dla których wyjście jest oczywiście

Base.foo()

Derived.foo()

jako pochodna funkcja foo ()ukrywa się podstawowa funkcja foo. Chcę zapobiec możliwemu ukryciu, więc moim pomysłem było zmienić definicję Base pliku nagłówkowego na:

//.....
class Base{
    public:  
    virtual void foo() final {
        std::cout << "Base.foo()\n" << std::endl;
    }
};

class Derived: public Base{ 
    public:
    void foo(){ //compile error
        std::cout << "Derived.foo()\n" << std::endl;
    }   
};
//......

Który wydaje się wymuszać to, co chcę z błędem kompilatora, zapobieganie ukrywaniu I / LUB ukrywanie w c ++, ale moje pytanie brzmi, czy to jestdobra praktyka skoro foo () nigdy nie było funkcją wirtualną? Czy jest w tym coś negatywnego, skoro jestem w pewnym sensienadużywać wirtualne słowo kluczowe? Dzięki.

questionAnswers(1)

yourAnswerToTheQuestion