использование ключевого слова virtual при объявлении класса

StackOverflow https://stackoverflow.com/questions/828880

  •  06-07-2019
  •  | 
  •  

Вопрос

В интервью меня спросили, как используется ключевое слово virtual при объявлении класса в C ++, и я ответил, что ключевое слово virtual нельзя использовать при объявлении класса в C ++.Интервьюер сказал, что это возможно, и попросил меня протестировать это позже.

Теперь, когда я сам это проверил, я пришел к выводу, что это возможно и это не ошибка компилятора.На самом деле, когда я делаю что-то подобное с помощью компилятора Visual C ++:

virtual class Test
{
   int i;
};

Я получаю предупреждение компилятора "warning C4091:"виртуальный " :игнорируется слева от "Test", если переменная не объявлена ".Я пока не смог выяснить, что означает это предупреждение и, кроме того, как используется ключевое слово virtual.Если полезного использования нет, то почему это вообще разрешено и почему это не ошибка компилятора.

Это было полезно?

Решение

Это ошибка в VC ++.Comeau и gcc оба отвергают этот код.

Другие советы

виртуальный может использоваться при выводе из другого класса:

class Foo : public virtual Bar
{
}

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

Вы просто не можете использовать virtual для класса.Это работает только для функций-членов

Вы смотрите на неправильный тип использования - я почти уверен, что интервьюер имел в виду объявления виртуального базового класса, например:

  class A : virtual public B, public C {
    ...
  };

Это распространенная идиома, которая используется для обхода сценария "множественного базового класса" в ромбовидных деревьях наследования.Типичная проблема с ними заключается в том, что вы наследуете как от класса B, так и от класса C, и у них общий предок A.Если вы подниметесь "вверх" по дереву наследования, вы столкнетесь с двусмысленностью относительно того, какой экземпляр "A" вы должны использовать.Если вместо этого B & C будут использовать A в качестве виртуального базового класса, они будут ссылаться на тот же экземпляр A, что решает эту проблему.

Вы можете найти более исчерпывающее описание в диаграммах классов здесь.

Может быть, он имел в виду виртуальное наследование / виртуальные базовые классы?Например.

class A : virtual public B
{ ... }

Технически это было бы частью определения класса.

Мог ли он говорить об использовании виртуального базового класса в объявлении класса?

Вот так:

class CashierQueue : virtual public Queue {};

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

class Queue {};
class CashierQueue : virtual public Queue {};
class LunchQueue : virtual public Queue {};
class LunchCashierQueue : public LunchQueue, public CashierQueue {};

Видишь http://msdn.microsoft.com/en-us/library/wcz57btd (ПРОТИВ 80).aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top