Symfonia nt. funkcji wirtualnych

0

Pytanie z symfonii c++ standard:

W klasie podstawowej bilet funkcja wirtualna drukuj jest publiczna. W klasie pochodnej bilet_ulgowy funkcja ta zdeklarowana jest jako private. Jak zareaguje kompilator widząc, że w tekście programu, w funkcji main uruchamiamy tę funkcję drukuj na rzecz:
d) obiektu klasy bilet_ulgowy pokazywanego wskaźnikiem typu bilet_ulgowy*.

Odpowiedzią jest kompilator zaprotestuje, gdyż będzie uważał tę funkcję za prywatną.

Mógłby mi ktoś to wyjaśnić? Skoro wskaźnik pokazuje na swoją klasę, więc chyba ta funkcja wirtualna powinna zostać wywołana?

0

W ogóle nie zrozumiałeś idei funkcji wirtualnej. Funkcja wirtualna jest właśnie po to, żeby móc wywołać metodę klasy pochodnej za pomocą wskaźnika do klasy bazowej. Niemniej zmiana modyfikatora dostępu w klasie pochodnej na bardziej restrykcyjny to kiepski pomysł.

Ten kod bez problemu się kompiluje i się uruchamia:

#include <iostream>
using namespace std;

class X
{
public:
	virtual void foo() { cout << "X" << endl; }
};

class Y : public X
{
private:
	virtual void foo() { cout << "Y" << endl; }	
};

int main() 
{
	X* x = new Y();
	x->foo();
	delete x;
	return 0;
}

Więc może wstawisz swój kod i ten protest kompilatora?

0

No tak. Jednak nie wiem czemu jest taka odpowiedź.

0

W tym pytaniu klasą bazową staję się bilet_ulgowy, więc potem powinno bez problemu wywołać to funkcję wirtualną z tej funkcji

Tutaj nie ma żadnego kodu do tego pytania.

W pytaniu chodzi o to:

 #include <iostream>
using namespace std;

class X
{
public:
    virtual void foo() { cout << "X" << endl; }
};

class Y : public X
{
private:
    virtual void foo() { cout << "Y" << endl; }
};

int main()
{
    X* y = new Y();
    y->foo();
    delete y;
    return 0;
}
0

d) obiektu klasy bilet_ulgowy pokazywanego wskaźnikiem typu bilet_ulgowy*.

Dobra, moja umiejętność czytania ze zrozumieniem szwankuje.

Jeżeli masz

bilet_ulgowy* foo = new bilet_ulgowy;
foo->drukuj()

to kompilator zaprotestuje, bo drukuj() jest private w klasie bilet_ulgowy. Funkcji prywatnych nie możesz wywołać poza klasą (i klasami/funkcjami zaprzyjaźnionymi).

1 użytkowników online, w tym zalogowanych: 0, gości: 1