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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top