2014-02-03 6 views
0
Below is a pseudo declaration for a multilevel inheritance. 

Base class (protected int data) 

derived1 : virtual public base (protected int data1) 

derived2 : virtual public base (protected int data2) 

derived3 : derived1,derived2 (private int data3) 

Main(){ base b; derived1 d1; derived2 d2; derived3 d3; } 

sizeof(b) // 4 which is correct as only int (4bytes) 
sizeof(d1) // 12 why not 8 -> 4(base) + 4(derived) 
sizeof(d2) // ??? whatever applies above should apply here 
sizeof(d3) // 24 why not 12 -> 4(base) + 4(derived1/derived2) + 4(d3). 

Имеет ли размер также и виртуальные таблицы. Опять же здесь не может быть виртуальной таблицы, поскольку никакая виртуальная функция не определена. Пожалуйста, помогите уточнить мои сомнения.Размер объектов при многоуровневом/множественном наследовании

PS: То, что я понял до сих пор:

Unless the function is declared virtual in base class, 

base *bptr; 
derived d; 
bptr = &d; 
bptr->fun(); // will call the base class function. 

But if the fun() is declared virtual then the above code will call derived class fun(). 
+5

Возвратный тип 'void' не будет работать. Он должен вернуть объект. Я не понимаю, как это у вас получилось: http://coliru.stacked-crooked.com/a/be4074970d5da3cb. Если вы ищете образец кода, есть уже [вопрос] (http://stackoverflow.com/questions/4421706/operator-overloading) о перегрузке оператора с образцом кода. – chris

+0

Вы даже попытались скомпилировать его? Как вы устали? http://ideone.com/BUh2nh говорит 'error: return-statement со значением, в функции, возвращающей 'void' [-fpermissive]'. – luk32

+0

Извините за двойной комментарий, но эта «я попробовала» часть кажется большой ложью. -1 = (. – luk32

ответ

1

Прежде всего, в вашей реализации выше, вам необходимо вернуть тип count вместо void.

Например, предположим, что вы заявили int count.

Затем вам нужно вернуть int в версии «постфикс» и int& или const int& в префиксной версии.

Попробуйте b = a++ и b = ++a, и вы увидите (конечно, вам понадобится каждая функция, чтобы вернуть значение).

Разница между этими двумя версиями заключается только в возвратном значении . «Префикс ++» возвращает значение до операции, а «постфикс ++» возвращает значение countпосле операции.

Кроме того, в силу своей природы, "постфикса ++ может только вернуть копию переменной инкрементируется (например, int), в то время как 'префикс ++ может также возвращает ссылку на эту переменную (например, int&).

Поскольку вы ничего не возвращаете в своей реализации, вы не можете использовать разницу между этими двумя версиями.

+0

см. Отредактированную часть сейчас ... удалено ключевое слово return .... фактическая реализация имеет переменную count в классе. извините за то, что тратил свое время ... должно было дать правильный код ... но теперь это правильно ... объясните, как использовать оба метода перегрузки оператора – Haswell

+0

Ну, вся идея операторов '++' что они возвращают значение. Если они ничего не вернут, очевидно, что при вызове 'prefix ++' и 'postfix ++' будут иметь такое же влияние. И, как я уже упоминал в своем ответе выше, я до сих пор не вижу, как ваш код компилируется без ошибки при вызове 'a ++' без реализации postfix ++. –

+0

Я отредактировал вторую часть. :( – Haswell

Смежные вопросы