2009-09-30 14 views
6

mam następujących klas:C++ wywołać metodę wirtualną w klasie dziecko

class A { 
protected: 
    A *inner; 
public: 
    .... 
    virtual void doSomething() = 0; 
    .... 
} 

class B: public A { 
    ... 
    void doSomething() { 
     if(inner != NULL) 
      inner->doSomething(); 
    } 
    ... 
} 

Gdy używam inner->doSomething() otrzymuję winy segmentacji. Co należy zrobić, aby zadzwonić pod numer inner->doSomething() w klasie B?

z góry dzięki.

+3

Jeśli podczas używania wewnętrznego pojawi się błąd segfault, prawdopodobnie nie wskazuje on poprawnego obiektu. Jak zainicjalizować wewnętrzną w B? –

+0

Każdy A zawiera A *? Naprawdę? Czemu? –

+0

Ok, oni patrzą na siebie. Chciałem tylko sprawdzić. –

Odpowiedz

9

Bez jawnej inicjalizacji elementu wewnętrznego, możliwe jest, że nie będzie on miał wartości NULL i wskazywał na niepoprawną pamięć. Czy możesz pokazać nam kod, który jawnie inicjalizuje wewnętrzny?

odpowiedni konstruktor A byłby następujący

protected: 
A() : inner(NULL) { 
    ... 
} 
+1

Alternatywnie do sugestii JaredPar, w konstruktorze podaj wewnętrzną = NULL. Wstaw punkt przerwania w doSomething() klasy podklasy i obserwuj wartość wewnętrzną? – Calyth

+2

nie został zainicjowany, ponieważ oczekiwałem, że będzie NULL, a instrukcja if będzie fałszywa. nie wiedziałem, że obiekt może być zarówno NULL, jak i wskazywać na nieważną pamięć. Po prostu zrobiłem wewnętrzną = NULL na konduktorze B i rozwiązałem problem. dziękuję bardzo. – marcosbeirigo

+2

UWAGA: dla wszystkich standardowych typów (wskaźniki, int, float itp.) Zwane również wbudowanymi) zmienna nie jest inicjowana po zbudowaniu (nie ma "domyślnych konstruktorów"). Ponieważ "wewnętrzna" jest cechą A, to jest odpowiedzialnością konstruktora A, aby ją zainicjować, w przeciwnym razie będziesz miał problem z każdą klasą dzieci ... –

4

choć jeśli przypisać A * będzie taka sama jak B zainicjowany ten wskaźnik dostaniesz przepełnienie stosu ... jakiegoś powodu potrzebujesz wewnętrznego? Nie możesz po prostu zadzwonić do A :: DoSomething()?

Powiązane problemy