Nie, takie cos nie jest możliwe i biorac pod uwage to ze nie powinno sie uzywac skladowych publicznych w programowaniu obiektowym - taki mechanizm nie ma racji bytu. Jesli chcesz osiagnac sam efekt to zrob virtualna metode get ktora zwroci referencje do odpowiedniej skladowej.
A tak na marginesie wybrales bardzo zly przyklad dziedziczenia: w peogrprogramo obiektowym kwadrat nie jest prostokatem i i rekruterzy lubia zadawac to pytanie na rozmowach o prace :p
Najłatwiej będzie pokazać kod:
class Rectangle {
protected:
double width;
double height;
public:
double getWidth() { return width; }
double getHeigth() { return height; }
double setHeight(double newHeight) { height = newHeight; }
double setWidth(double newWidth) { width = newWidth; }
double area() { return width * height; }
double length() { return 2 * width + 2 * height; }
};
class Cube : public Rectangle {
public:
//ale moment przeciez cube ma tylko jedno pole
//co tu zrobic?????
double setHeight(double newHeight) { height = newHeight; width = newHeight; }
double setWidth(double newWidth) { width = newWidth; height = newWidth; }
//brzydkie jak cholera, widac na pierwszy rzut oka
//interfejs publiczny tej klasy jest nieczytelny
//i nadmiarowy
};
I pozostaje problem z tym, że tak na prawdę to dla kwadratu nie ma sensu rozdzielenie wysokości i szerokości. Ktoś powie, rozwiązaliśmy problem, nie wygląda to ładnie, ale wszystko jest ok.
Ale czemu dziedziczenie tu tak bardzo nie pasuje skoro kwadrat przecież jest prostokątem. Po pierwsze co się może rzucić w oczy - generalnie dziedziczenie ma rozszerzać funkcjonalności. Tutaj mamy ich zawężenie, bo pasowałoby usunąć jedną pare seterów i geterów, gdyż są one zbędne. To samo z polami, jedno z nich jest zbędne. Widzimy więc, że to co chcielibyśmy zrobić to okroić klase prostokąt a nie dodać do niej dodatkowe funkcjonalności poza tymi, które już ma.
Czemu to jest złe? Na razie bez przytaczania jakichkolwiek zasad. Przysłonięte metody robią coś więcej niż twierdzą, że robią w nazwie. setHeigth ustawia równocześnie width. Bez sensu. Jakiś programista może patrzeć na same deklaracie w pliku .h i nie będzie wiedział, że metoda, której używa ma efekty uboczne, które mogą zostać wykryte o wiele później w postaci ciężkiego w znalezieniu buga.
Prawdziwy problem polega na nieprecyzyjnym nazwaniu naszych obiektów. Rectangle powinien nazywać się ResizeableRectangle, bo można edytować jego boki po stwtorzeniu obiektu. Teraz widzimy, że dziedziczenie jest zaprojektowane bez sensu, bo kwadrat - w większości przypadków - wcale nie jest prostokątem o edytowalnych bokach.
Rozwiązanie problemu to wywalenie seterów i zrobienie z naszych kształtów tzw "immutable objects", czyli takich obiektów których po stworzeniu nie można już edytować. Tzn boki prostokąta można ustawiać tylko w konstruktorze. Jeśli chcemy prostokąt o innych bokach trzeba stworzyć nowy. Poniekąd jest to uczieczka od oryginalnego problemu, ale jest to jedyne sensowne rozwiązanie. Teraz dziedziczenie niczego już nie zepsuje.
Teraz czemu cała ta debata jest ważna i czemu pyta się o to na rozmowach o pracę. Podobny mechanizm jest częstym źródłem błędów w dużych aplikacjach, ale można go wyeliminować stosując się do jednej z zasady SOLID, która mówi, że obiekty klas pochodnych powinne "pasować" tam gdzie oczekujemy obiektów bazowych. Chodzi o to, że rozszerzona funkcja musi działać dla większego lub równego zbioru danych wejściowych i zwracać mniejszy lub równy zbiór danych wyjściowych. Nie może osłabić post-conditions i wzmocnić pre-conditions. Tzn jeśli metoda z klasy bazowej o takiej sygnaturze:
int fun(int x);
Działała zarówno dla dodatnich jak i ujemnych iksów a zwracała liczby tylko dodatnie to rozszerzenie tej metody w klasie pochodnej nie może zawęzić warunków wstępnych (np rzucać wyjątku w przypadku jesli x jest < 0) i poszerzać warunków wyjściowych (tzn zwracać liczb dodatnich i ujemnych jeśli bazowa zwracała tylko dodatnie, to samo z rzucaniem wyjątku; jeśli bazowa wyjątków nie rzucała, to pochodna też może, bo te obiekty mają być wymienialne, tzn, że gdyby w miejscach gdzie zazwyczaj pracujemy na obiektach klasy bazowej pojawił się obiekt klasy pochodnej to, żeby nic nas nie zaskoczyło - a zaskoczeniem mogłoby być np rzucenie wyjątku; bazowa nie rzucała więc nie baliśmy się że rzuci i nie łapaliśmy, przez co gdy pojawi się tam pochodna to wyjątek nas zaskoczy.
Rozpisałem się, prawdopodobnie niepotrzebnie, bo jak troszke googlowałem na ten temat to wszędzie opisywany jest własnie ten problem relacji prostokąta z kwadratem :D. Nawet po polsku jest:
https://pl.wikipedia.org/wiki/Zasada_podstawienia_Liskov
A tutaj bardzo ciekawa wypowiedz na stacku:
https://softwareengineering.stackexchange.com/questions/238176/why-would-square-inheriting-from-rectangle-be-problematic-if-we-override-the-set?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
I generalnie dziedziczenie jest bardzo kłopotliwe więc często rezygnuje się z niego na rzecz kompozycji.