Wskaźnik polimorficzny, a dostęp do atrybutów klasy

0

Witam. Mam do Was takie pytanie: czy używając wskaźnika polimorficznego, odnoszę się do atrybutu klasy wirtualnej, czy dziedziczącej? Chodzi mi o taką sytuację: w pewnej klasie mam kilka prywatnych atrybutów, deklaruję je jako wirtualne i ustawiam na zero. Z tej klasy dziedziczy kilka innych, w których te atrybuty zostają zasłonięte. Wiem, że pytanie może wydawać się głupie, ale wolę zadać je teraz niż potem szukać ewentualnych błędów. Czy działa to tak samo, jak dla metod? Dostęp z zewnątrz byłby realizowany dzięki deklaracji przyjaźni (czy może lepiej zostać przy setterach i getterach?).

1

Pytanie dotyczy C++ czy C#? Jesli C++ to pokaz kod, bo nie wiem co to "atrybut klasy", "deklaruje jako wirtualne" w kontekscie C++.

0

Jeszcze nie mam kodu, przestawiona sytuacja jest czysto teoretyczna. Poprzez atrybut rozumiem pole klasy. Język to C++.

0

Z tej klasy dziedziczy kilka innych, w których te atrybuty zostają zasłonięte

Chodziło chyba o nadpisane (overridden), a nie przysłonięte (shadowed).

0
#include <iostream>
using namespace std;

class Base
{
public:
    int getX() { return x; }
protected:
    int x = 0;
};

class Derived : public Base
{
public:
    Derived() { x = -5; }  
};

int main()
{
    Base* ptr = new Base();
    cout << ptr->getX() << endl;
    delete ptr;
    
    ptr = new Derived();
    cout << ptr->getX() << endl;
    delete ptr;
}
0
-5

O to chodzi?

0

No tak nie do końca. Już wiem, jak sformułować pytanie: czy pola (zmienne) klasy abstrakcyjnej mogą być wirtualne/czysto wirtualne?

0

Jak taka wirtualność miałaby się objawiać?

0

Dzięki deklaracji przyjaźni z klasami potomnymi nie musiałbym tworzyć setterów i getterów. Dostęp miałby odbywać się bezpośrednio przez wskaźnik polimorficzny.

0

Może czegoś nie rozumiem, ale tak działają zwykłe zmienne.

0

Czyli gdybym zadeklarował jakieś zmienne w klasie bazowej, a potem nadpisał je w klasach potomnych, to rozumiem, że poprzez wskaźnik polimorficzny uzyskam dostęp do tej zmiennej klasy pochodnej?

0
struct x
{
    int var;
    x(): var(42) {} // przypisanie
};

struct y : x 
{
    y() { var = 0; } // nadpisanie
};
0

przeciez o to co pytasz to jest trzecia odpowiedz w tym temacie!

https://4programmers.net/Forum/1488988

0
kst142 napisał(a):

Czyli gdybym zadeklarował jakieś zmienne w klasie bazowej, a potem nadpisał je w klasach potomnych, to rozumiem, że poprzez wskaźnik polimorficzny uzyskam dostęp do tej zmiennej klasy pochodnej?

Istnieje tylko jedna zmienna (to nie jest tak, że klasa bazowa ma jedną kopię, a pochodna inną), więc nieważne co zrobisz to odwołasz się do niej. Natomiast jaką wartość ma ta zmienna, czyli w tym przypadku jakie operacje zostały na niej wykonane, zależy od tego jakiego typu obiekt sobie stworzyłeś.

0

Wybaczcie tak długi brak odpowiedzi. W międzyczasie byłem skupiony na innych programach. Oczywiście bardzo dziękuję za rozwianie moich wątpliwości :) Ale mam jeszcze jedno pytanie: jeśli zadeklaruję w klasie bazowej (wirtualnej) pole prywatne będące obiektem klasy std::string lub std::vector, potem te pola nadpiszę i w klasie pochodnej zmienię ich rozmiar, to czy odwołanie się do takiego pola (kolejnych jego elementów) poprzez wskaźnik polimorficzny oraz pętlę jest dopuszczalne?
Przykładowo:
Tworzę klasę wirtualną Postać, z której dziedziczy kilka innych klas, np. Mag, Złodziej, itp. Każda z tych klas posiada vector z własnymi teksturami. Zamiast pisać dla każdej z tych klas oddzielną funkcję rysującą, chciałbym stworzyć jedną, ale przyjmującą wskaźnik polimorficzny typu Postać*.

0

pole prywatne będące obiektem klasy std::string lub std::vector, potem te pola nadpiszę i w klasie pochodnej zmienię ich rozmiar,

Klasy, o których wspominasz mają metodę .size(), zwracającą rozmiar kontenera.
Sprawdzaj przed użyciem, czy odwołanie mieści się w kontenerze i nie będzie problemu.
Możesz też użyć metody .at(), która rzuci wyjątkiem, gdy wyjdziesz poza zakres.

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