Rozmiar klasy c++

0

Mam taki mały problem:

 
int main()
{
	CParam1 test;
	test.setA(5);
	printf("rozmiar %d \n",sizeof(test));
	printf("rozmiar %d \n", test.getRozmiar());
}

class CParam1: public Ceep
{
public:
	int a;
	int b;
	int c;
	int d;

//	int getRozmiar()
//	{
//		return sizeof(*this);
//	}
};

class Ceep
{
public:


	int getRozmiar()
	{
		return sizeof(*this);
	}

};

chciałbym sprawdzić rozmiar klasy używając funkcji odziedziczonej ale to nie działa, szukam jakiegoś iinego rozwiązania

0

sizeof() jest obliczane w momencie kompilacji, a zwracana jest stała. W chwili kompilacji klasy Ceep zwracany jest rozmiar klasy Ceep.
Nie jest absolutnie możliwe przewidzenie, jaki będzie rozmiar jakiejś klasy potomnej.

2

Szczerze to się nie da, bo sizeof nie jest funkcją a operatorem rozwijanym w czasie kompilacji, co można zaobserwować pisząc coś takiego:

#include <stdio.h>

int main() {
  int a = 0;
  printf("%d", sizeof(a++));
  printf("%d", a);
}
1

Jeśli chciałbyś aby była możliwość dowiadywania się o rozmiar obiektu klasy nadrzędnej to musiałbyś sam sobie to zaimplementować np tak:

#include <cstdlib>
#include <cstdio>

class CParam1;

class Ceep
{
public:
	int sizeSuper;

        int getRozmiar()
        {
                return sizeSuper;
        }

};


class CParam1: public Ceep
{
public:
        int a;
        int b;
        int c;
        int d;

		CParam1() {
			Ceep::sizeSuper = sizeof(*this);
		}

        //int getRozmiar()
        //{
        //        return sizeof(*this);
        //}
};
 

int main() {
	
	
        CParam1 test;

        printf("rozmiar %d \n",sizeof(test));
        printf("rozmiar %d \n", test.getRozmiar());

	char z;	
	scanf("%i", &z);
	return 0;
}
 

To co ty zrobiłeś to chciałeś się dowiedzieć o rozmiar klasy "Cepp" który wynosi 1 bo nie zdefiniowałeś żadnego pola. Jak będziemy chcieli sprawdzać rozmiar klasy bez Pól to rozmiar będzie wynosić 1 bajt(w visualu przynajmniej tak jest). Nie ma możliwości dowiedzieć się o rozmiar klasy która ją dziedziczy ponieważ to są 2 osobne klasy i this wskazuje na obiekty 2 różnych klas. Mimo że zrobiliśmy dziedziczenie np z klasy "A" do "B" to w klasie "B" tkwi w pewnym sensie obiekt klasy "A" i this tego obiektu wskazuje jedynie na ten obiekt i nic więcej. Gdy wywołamy funkcję getRozmiar którą odziedziczyliśmy to tak na prawdę nie wywołaliśmy funkcji która należy do klasy pochodnej tylko wywołaliśmy funkcję która należy do klasy bazowej. najłatwiej wyobrazić sobie to tak:
z klasy pochodnej nie możemy się odnieść do prywatnych składowych klasy podstawej. Dzięki czemu jest zachowana enkapsulacja. Bo inaczej przez dziedzicznie moglibyśmy oszukiwać. Czyli w obiekcie klasy pochodnej tkwi w pewnym sensie obiekt klasy bazowej.

0

Dzieki za konkretną odpowiedz

0

Jeszcze jedna mała poprawka. sizeof nie zwraca rozmiaru w bajtach a w wielokrotności rozmiaru char. Z tego wynika, że sizeof(char) == 1 zawsze.

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