2010-08-31 2 views
2

виртуальный и встроенный спецификатор функции.Спецификатор функции

Они могут отображаться только перед функцией. {Согласно моему пониманию}.

Затем, в следующем коде, что является виртуальным?

class Base 
{ 
// 
}; 

class Derived :virtual public Base 
{ 
}; 
+1

http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.9 Это поможет вам. – liaK

ответ

2

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

+0

Спасибо, Андрей. Меня смутили только формулировки. Речь шла не о «Виртуальном наследовании». –

1

Это виртуальное наследование, посмотрите here для получения пояснения.

Общее использование, если у вас есть класс A, наследующий от 2 классов B и C, которые, в свою очередь, наследуются от одного и того же предка D. Это проблематично с обычным наследованием, поскольку A будет содержать два экземпляра D, поэтому который следует использовать. Использование виртуального наследования, например. C, наследующий виртуальный от D, адрес экземпляра D в C-части A находится в vmt, поэтому он может указывать на тот же экземпляр, что B-часть использует

0

virtual inheritence его использовали для указания способа Наследование работает при множественном наследовании. по сути, это позволяет вам иметь диаграммы графа «алмаза», а не виртуальные, которые дадут вам дерево, с несколькими основаниями кладки на листьях (повышение потенциальной проблемы неопределенности).

2

$ 10,1/4- «Базовый класс спецификатор, который содержит ключевое слово виртуальный, указывает виртуальный базовый класс. Для каждого отдельного возникновение не виртуальной базового класса в классе решетке наиболее производного класса , то наиболее производный объект (1.8) должен содержать соответствующий отчетливый базовый класс субобъект этого типа. Для каждого отдельного базового класса, который указан виртуальных, наиболее производный объект должен содержать класс субобъект одного базового этого типа. "

Поэтому, учитывая иерархии

struct A{}; 
struct B : virtual A{}; 
struct C : virtual A{}; 
struct D : B, C{}; 

D d; 

«D» объект имеет только один «A» субобъект т.е. конструктор «A» вызывается только один раз, и это тоже, прежде чем любой другой конструктор запустить.

$ 12.6.2/5 - «Инициализация должна действовать в следующем порядке:

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

- Тогда прямые базовые классы должны быть инициализируются в декларации того, как они появляются в базовом спецификаторе-листе (независимо от порядка MEM-инициализаторов).

- Тогда, нестатические элементы данных должны быть инициализированы в порядке они были объявлены в определении класса (опять же, независимо от порядка АЕТ-инициализаторы).

- И наконец, выполнено тело конструктора . [Примечание: в заявлении указывается, что основание и субобъекты-члены уничтожены в в порядке, обратном порядку инициализации. ]

+0

Тогда в случае виртуального - это что ?? Функция спецификатора !! Точно нет. –

+0

@ Суденду Шарма: Виртуальный имеет разные значения в разных контекстах. Как виртуальный спецификатор функций класса, он является механизмом поддержки динамического связывания. Он в основном представляет поведение, которое производный класс может переопределить. Когда он используется в качестве спецификатора базового класса, он указывает, что я описал в своем сообщении. – Chubsdad

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