uso de palavra-chave virtual com uma declaração da classe
Pergunta
I foi perguntado em uma entrevista que o que é o uso de palavra-chave virtual com uma declaração da classe em C ++ e eu respondi essa palavra-chave virtual não pode ser usado com uma declaração da classe em C ++. O entrevistador disse que é possível e me pediu para testá-lo mais tarde.
Agora que eu verifiquei-me que eu vim a saber que isso é possível e isso não é um erro do compilador. Na verdade, quando eu fazer algo assim com um compilador Visual C ++:
virtual class Test
{
int i;
};
Eu recebo um aviso do compilador "aviso C4091: 'virtual': ignorado na esquerda do 'Test' quando nenhuma variável é declarada". Eu não tenho sido capaz de descobrir ainda que o que significa este aviso e ainda mais o que é o uso de palavra-chave virtual. Se não houver um uso útil, então por que isso permitiu em primeiro lugar e por isso não é um erro do compilador.
Solução
Isso é um bug no VC ++. Comeau e gcc rejeitarem o código.
Outras dicas
virtual pode ser usado ao derivar de outra classe:
class Foo : public virtual Bar
{
}
Esta é utilizada para evitar que múltiplas versões do mesmo classe base quando se utiliza herança múltipla. Wikipedia tem um bom artigo sobre o assunto.
Você simplesmente não pode usar virtual para uma classe. Ele só funciona para funções de membro
Você está olhando para o tipo errado de uso - Tenho certeza de que o entrevistador estava se referindo a declarações de classe base virtual, assim:
class A : virtual public B, public C {
...
};
Este é um idioma comum e usado para contornar o cenário de "múltipla classe base" em árvores de herança em forma de diamante. O problema típico com eles é que você herda de ambos classe B e classe C e eles compartilham o ancestral comum A. Se você vai 'up' a árvore de herança você vai bater a ambiguidade sobre qual instância de 'A' você está suposto uso. Se B & C têm A como uma classe base virtual em vez disso, eles se referem à mesma instância de A, o que resolve este problema.
Você pode encontrar uma descrição mais exaustiva com diagramas de classe aqui .
Talvez ele estava se referindo a herança virtual classes base / virtuais? Por exemplo.
class A : virtual public B
{ ... }
Isso seria tecnicamente parte da definição de classe.
Ele poderia ter falado sobre o uso de uma classe base virtual na declaração da classe?
Como esta:
class CashierQueue : virtual public Queue {};
Este é usado em herança múltipla quando você quer evitar uma classe derivada ter várias cópias dos dados dos membros quando se herda de duas ou mais classes que compartilham a mesma classe de base.
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