Полиморфизм и Указатели на массивы [дубликат]

В течение долгого времени я сделал точно, что сделал bcwood. Я сохраняю копии web.dev.config, web.test.config, web.prod.config, и т.д. при управлении исходным кодом, и затем мой создавать/развертывать систему переименовывает их автоматически, поскольку это развертывается к различным средам. Вы получаете определенное количество дублирования между файлами (особенно со всем материалом asp.net там), но обычно это работает действительно хорошо. Также необходимо удостовериться, что все в команде не забывают обновлять весь файлы, когда они вносят изменение.

Между прочим, мне нравится сохранять ".config" в конце как расширение так, чтобы ассоциации файлов не становились поврежденными.

До локальных версий разработчика файла конфигурации, я всегда стараюсь изо всех сил поощрять людей использовать те же локальные настройки как можно больше так, чтобы не было никакой потребности иметь Вашу собственную версию. Это не всегда работает на всех, в этом случае люди обычно просто заменяют его локально по мере необходимости и идут оттуда. Это не слишком болезненно или ничто.

7
задан 11 September 2009 в 16:05
поделиться

3 ответа

Вы не можете обрабатывать массивы полиморфно, поэтому пока new B [100] создает массив из B объектов и возвращает указатель на массив - или, что то же самое, первый элемент массива - и, хотя назначать этот указатель на указатель базового класса допустимо, нельзя рассматривать его как указатель на массив объектов A .

Основная причина, по которой вы не можете этого сделать, заключается в том, что (обычно) производные объекты имеют размер, отличный от их базовых классов, поэтому при попытке доступа к массиву как к массиву объектов базового класса не будет использоваться правильное смещение для получения указателя. к следующему подобъекту базового класса следующего члена массива производного класса.

12
ответ дан 6 December 2019 в 11:50
поделиться

Вы не разместили объекты в массиве:

for (int i=0;i<100;i++)
  var[i] = new B;

(хотя я, возможно, смешиваю C ++ и C #)

0
ответ дан 6 December 2019 в 11:50
поделиться

Проблема не в полиморфизме, а в том, как вы работаете с памятью. Оператор [] будет перемещать вас по массиву на размер байтов sizeof (A) в первом случае и sizeof (B) байтов во втором случае. Поскольку объекты относятся к типу B, A * не указывает на правильное место в памяти.

Вот другой способ взглянуть на него

char * var;
var = (char*) new B[100];
std::cout << ((A*)var[0]).getValue(); //This works fine
std::cout << ((A*)var[1]).getValue(); //This will fail
std::cout << ((A*)var[sizeof(B)]).getValue(); // should work
5
ответ дан 6 December 2019 в 11:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: