использование виртуального ключевого слова с объявлением класса - PullRequest
1 голос
/ 06 мая 2009

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

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

virtual class Test
{
   int i;
};

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

Ответы [ 6 ]

6 голосов
/ 06 мая 2009

Это ошибка в VC ++. Comeau и gcc оба отклоняют код.

6 голосов
/ 06 мая 2009

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

class Foo : public virtual Bar
{
}

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

2 голосов
/ 06 мая 2009

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

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

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

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

2 голосов
/ 06 мая 2009

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

1 голос
/ 06 мая 2009

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

Как это:

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(VS.80).aspx

1 голос
/ 06 мая 2009

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

class A : virtual public B
{ ... }

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

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