2012-01-08 13 views
6

Sytuacja wygląda następująco.Zapobiegaj klasie dziedziczącej z nadrzędnej funkcji wirtualnej klasy bazowej

class Interface 
{ 
public: 
    virtual void foo() = 0; 
} 

class MyClass : Interface 
{ 
public: 
    virtual void bar() = 0; 
private: 
    void foo() 
    { 
     //Some private work and checks. 
     bar(); 
    }; 
} 

chcę, że mój użytkownik utworzy klasę które dziedziczą z MojaKlasa, a będą musieli tam bar() wdrożenia.
Ale jak mogę je zatwierdzić, nie zastąpią foo()? ponieważ ważne jest, aby używać mojego foo().

+0

Czy to się kompiluje? Jeśli tak, nie masz problemu, ponieważ Twój foo jest prywatny. Edycja: ah, nie, nie kompiluje się ... –

+2

@MrLister: Prywatne metody mogą nadal zostać zmienione. –

+0

To prawda, przepraszam. Nieważne więc. Odpowiedź już została udzielona. –

Odpowiedz

13

w C++ 11 można oznaczyć Sposób final aby zapobiec jego nadpisane:

class MyClass : Interface 
{ 
public: 
    virtual void bar() = 0; 
private: 
    void foo() final 
    { 
     //Some private work and checks. 
     bar(); 
    }; 
} 
+0

Dzięki, poprowadzisz mnie we właściwym kierunku. ale w C++ 11V1.0 'final' zmieniono na' zapieczętowany'. –

+5

Przeczytaj [to pytanie] (http://stackoverflow.com/questions/7026462). 'sealed' jest specyficzne dla Microsoft. 'final' jest zdefiniowany w §7.6.4 [dcl.attr.final] standardu C++ 11. –

+0

Dzięki! Tego właśnie szukam: D – mr5

6

Według innej odpowiedzi, można użyć final słowa kluczowego w C++ 11 (takiego obiektu jest podobna do słowa kluczowego Java final).

Dla kodu C++ 03, można użyć mechanizmu CRTP (pod warunkiem, jeśli można zmienić definicję 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(); 
    }; 
} 

Więc teraz trzeba usunąć virtual Ness z foo() i wiązanie się wydarzy w czasie kompilacji. Pamiętaj, że CRTP ma własne ograniczenia, więc czy go używać, czy nie, zależy od Ciebie.

Powiązane problemy