2013-04-04 10 views
5

Podczas gdy pracowałem w C++ przez jakiś czas, nie musiałem do tej pory korzystać z polimorficznych cech i jestem nimi bardzo zaintrygowany.Podstawowe wskaźniki polimorficzne do klas bazowych

Jeśli mam klasę bazową ClassA i inny ClassB wywodzi się z nią, rozumiem, że mogę mieć virtual funkcję składową w ClassA, że po wdrożeniu w ClassB, zostanie wywołana w ClassB przykład nawet jeśli instancja jest skierowany na za pomocą wskaźnika ClassA. Bez tego słowa kluczowego virtual, zakładam, że implementacja klasy bazowej przeważa przy użyciu wskaźnika klasy bazowej, ale działa na obiekcie, który został utworzony z podklasy, co wydaje mi się wątpliwe, jeśli w rzeczywistości ClassB ma własną implementację tej samej funkcji w takim przypadku jest to faktycznie ignorowane.

Czy to prawidłowe zrozumienie zachowania polimorficznego?

Teraz prawdziwe pytanie brzmi: w jaki sposób odwołujesz się do ClassB używając wskaźnika do klasy bazowej. Mogę naprawdę tylko pomyśleć dwa sposoby:

  1. Tworzenie wskaźnik w momencie konkretyzacji, wykorzystując funkcję, która zwraca wskaźnik klasy bazowej, podczas gdy faktycznie przydzielania pamięci dla podklasy zamiast przy użyciu konstruktora podklasy za. (Czy taka funkcja tworzenia ma wspólną nazwę?)
  2. Przesyłanie obiektu przy użyciu static_cast i przypisywanie go do wskaźnika do klasy bazowej.

Czy są to dwie główne techniki generowania wskaźników klasy bazowej dla obiektów podklasy?

+0

powiązanymi: http://stackoverflow.com/q/5854581/46821 –

Odpowiedz

9

Najprostszym sposobem jest po prostu przypisać go, bez konieczności rzucania:

ClassA *ptrA = new ClassB; 

Jesteś poprawne, że trzeba słowa kluczowego virtual włączyć polimorficzne. Oto jeden sposób, aby o tym pomyśleć. C++ działa na statycznym typie obiektu. Podczas wywoływania ptrA->foo() typ wskaźnika to ClassA*. Jeśli funkcja ta nie zostanie zadeklarowana jako virtual, to ślepo wywoła funkcję wersji ClassA. Nie ma innego wyjścia. Ale jeśli foo() jest , to wie, aby zatrzymać i zapytać, "Zaczekaj, jaki typ jestem naprawdę?" Odpowiedź brzmi: ClassB, więc zadzwoni pod wersję ClassB.

Należy również pamiętać, że do tego celu nie są potrzebne wskaźniki. Innym popularnym sposobem zobaczysz polimorfizm w działaniu jest poprzez wywołanie funkcji:

void bar(ClassA &aObj) 
{ 
    aObj.foo(); 
} 

// ... 
ClassB bObj; 
bar(bObj); 
+0

+1 dla prostoty :) – scones

+0

rzeczywiście, właśnie przypadkowo szukając słowa w słowniku, słowo było * eleganckie * i zrobiłem podwójne zdanie, gdy definicja była w rzeczywistości dokładnym fragmentem kodu podanym powyżej! – johnbakers

+0

+1 za wskazanie, że alokacja dynamiczna i wskaźniki są ortogonalne do polimorfizmu (nawet jeśli często są używane łącznie). –

Powiązane problemy