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.