Mam:

class A{
    public:
        virtual void foo();
};

class B : public A{
    public:
        void foo();
};

B *ptr = new B();

Chcę wywołać foo() A BEZPOŚREDNIO za pomocą wskaźnika „ptr”.

Kiedy próbuję

(A*)ptr->foo();

Nadal wywołuje wersję B foo(). Jak zamiast tego nazwać wersję A?

Czy to możliwe? Jakie są alternatywy? Dziękuję Ci.

9
nahpr 29 sierpień 2012, 20:33

2 odpowiedzi

Najlepsza odpowiedź

Kiedy nazywasz funkcję za pomocą formularza rozpoznawania zakresu ::, wywołujesz nazwaną funkcję tak, jakby nie była wirtualna.

ptr->A::foo();
19
aschepler 29 sierpień 2012, 20:35

Musisz upublicznić swoje funkcje. Robisz to po prostu, wprowadzając następującą zmianę:

class A{
    public:
        virtual void foo();
};

class B : public A{
    public:
        void foo();
};

Jeśli tego nie zrobisz, funkcje są automatycznie prywatne i niedostępne z „zewnątrz”.

2
Code-Apprentice 29 sierpień 2012, 20:36