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.
2 odpowiedzi
Kiedy nazywasz funkcję za pomocą formularza rozpoznawania zakresu ::
, wywołujesz nazwaną funkcję tak, jakby nie była wirtualna.
ptr->A::foo();
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”.
Podobne pytania
Nowe pytania
c++
C ++ to język programowania ogólnego przeznaczenia. Pierwotnie został zaprojektowany jako rozszerzenie C i ma podobną składnię, ale teraz jest to zupełnie inny język. Użyj tego tagu w przypadku pytań dotyczących kodu (który ma zostać) skompilowany za pomocą kompilatora C ++. Użyj znacznika specyficznego dla wersji w przypadku pytań związanych z określoną wersją standardu [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] lub [C ++ 23] itp. .