• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Porównywanie obiektów różnych klas C++

0 głosów
780 wizyt
pytanie zadane 25 kwietnia 2022 w C i C++ przez Mavimix Dyskutant (8,490 p.)

Mam klasę abstrakcyjną:

class Pet
{
     public: virtual void sayHello();
};

Oraz klasę pochodną:

class Dog : public Pet
{
     void sayHello()
     {
          std::cout<<"Hello";
     }
};

class Cat: public Pet
{
     void sayHello()
     {
          std::cout<<"meh";
     }
};

Oraz mam wektor wskaźników na klasę abstrakcyjną:

Dog dog;
Cat cat;

std::vector<Pet*> pets;

pets.push_front(&dog);
pets.push_front(&cat);

Czy jest jakiś sposób aby porównać czy element wektora jest np. klasy Dog? Coś w ten deseń:

if(pets[1] == Dog)
//Ten konkretny przyklad powoduje blad "C++ type name is not allowed"
//if(<element wektora> == <klasa pochodna>

 

1 odpowiedź

+1 głos
odpowiedź 25 kwietnia 2022 przez adrian17 Mentor (355,240 p.)
wybrane 25 kwietnia 2022 przez Mavimix
 
Najlepsza

Tak, jest dynamic_cast:

if (dynamic_cast<Dog*>(pets[1]) != nullptr) {...}

Można też porównywać typy dwóch obiektów:

https://stackoverflow.com/questions/46837843/check-if-two-smart-pointers-point-to-the-same-derived-class

komentarz 25 kwietnia 2022 przez Oscar Nałogowiec (29,420 p.)
Ale pozostaje kwestia czy chodzi o sprawdzenie czy obiekt jest dokładnie klasy Dog, czy też jakiejś klasy pochodnej (zawierających w sobie klasę Dog) np. poszczególnych psich ras.

Podobne pytania

0 głosów
2 odpowiedzi 1,044 wizyt
+1 głos
1 odpowiedź 667 wizyt
0 głosów
2 odpowiedzi 447 wizyt

93,790 zapytań

142,754 odpowiedzi

323,429 komentarzy

63,394 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...