Witam. Metoda moze byc przeciazona w klasie (redefining tzw). Jakie są wtedy prawa dostepu do metody w klasie bazowej?
Metoda przeciążona (overloaded) to taka, która dzieli z inną metodą nazwę, ale różnią je parametry.
Metoda przedefiniowana (redefined) to metoda, która dzieli nazwę z metodą niewirtualną z klasy bazowej.
O którą ci chodzi? Nie wiem czy do końca rozumiem o co chodzi w tych prawach dostępu do metody (której?) w klasie bazowej. Rzuć jakimś kodem najlepiej.
Chodzi o metodę przedefiniowaną (redefined) zarówno w pierwszym jak i drugim pytaniu. Kodem nie sypnę bo do końca tego nie rozumiem, a pytanie wzięło się z egzaminu.
Ja też nie rozumiem pytania.
Może tu chodzi o nie o prawa a sposób dostępu do metody z klasy bazowej przesłoniętej (przedefiniowanej) przez metodę w klasie pochodnej (stąd ta bazowa w pytaniu)?
Moim zdanie prawa dostępu do metody zależą od specyfikatora dostępu użytego w klasie do tej metody.
Ogólne biorąc funkcje (w tym metody) mogą być przeciążane w tym samym zakresie widoczności (zasięgu). Czy to jest redefining? Pasuje overloading. Ponieważ zasięg dla metod ogranicza się do jednej klasy. Jednak w pytaniu jest jak jest.
Aby odnieść się do zasłoniętej(przedefiniowanej) metody z klasy bazowej w klasie pochodnej należy podać kwalifikator zakresu. Np:
class bazowa
{
void metoda(void)
{
//kod funkcji "metoda" z klasy bazowej
}
};
class pochodna
{
void metoda(void) // to jest przesłonięta funkcja(ma taką samą nazwę) od tej z klasy bazowej
{
bazowa::metoda(); //wywołujemy funkcje składową z klasy podstawowej(bazowej)
// tutaj kod funckji "metoda" z klasy pochodnej
}
};
jak widać w klasie pochodnej możemy wywołać funkcję z klasy podstawowej która będzie mogła zmieniać prywatne pola(dane składowe) z klasy bazowej. Z klasy pochodnej nie możemy manipulować prywatnymi polami od klasy bazowej nawet jeśli by zrobiliśmy dziedziczenie publiczne. Prywatność danych klas zawsze musi być zawsze zachowana.
robcio napisał(a):
Prywatność danych klas zawsze musi być zawsze zachowana.
no chyba, że private to nie private ;)
#define private public
class A {
private:
int a;
};
class B : public A {
void foo() { a = 2; }
};
jednak dalej lipa dla:
class A {
int a;
};