Безопасно ли, если виртуальная функция ссылается на переменную в производном классе в C ++? - PullRequest
2 голосов
/ 26 июня 2010

Когда полученный брошен обратно в базу. Под безопасностью я подразумеваю, что он работает правильно для известного компилятора c ++. Похоже, работает на VIsual C ++ 2008. * 1001 например *

class zero
{
 virtual int v()=0;
}

class a: public zero
{
public:
   int value;
   a(int vin)
   {
      value =vin;
   }
   int v()
   {
      return value;
   }
}


zero *e1= new a(3);
cout << e1->v();

Ответы [ 3 ]

14 голосов
/ 26 июня 2010

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

4 голосов
/ 26 июня 2010

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

1 голос
/ 27 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...