Pergunta

Eu li um monte de pessoas que escrevem "uma tabela virtual que existe para uma classe que tem uma função virtual declarado no mesmo".

A minha pergunta é, será que uma vtable existe apenas para uma classe que tem uma função virtual ou também existe para as classes derivadas da classe.

e.g

class Base{
    public:
        virtual void print(){cout<<"Base Print\n";}
};
class Derived:public Base{
    public:
        void print(){cout<<"Derived print\n";}
};

//From main.cpp 
Base* b = new Derived;
b->print();

Pergunta:Se não tivesse ocorrido o vtable para a classe derivada, então o resultado não teria sido "derivada de impressão".Assim IMO existe uma vtable para qualquer classe que tem a função virtual declarada e também em classes que herdam da classe.Isso está correto ?

Foi útil?

Solução

Na medida apenas virtual-função funcionalidade específica é considerada, em uma abordagem tradicional para a vtable implementação da classe derivada iria precisar de uma versão separada de vtable se, e somente se, que classe derivada substitui pelo menos uma função virtual.No seu exemplo, Derived substitui a função virtual print.Desde Derived tem a sua própria versão de print, a entrada correspondente na Derived vtable é diferente do que em Base vtable.Isso normalmente seria exigir um separado vtable para Derived.

Se Derived não substituir nada, formalmente, ele ainda seria um separado polimórfico de classe, mas, a fim de tornar suas funções virtuais funcionem corretamente, nós poderia simplesmente ter reutilizado Base vtable para Derived bem.Então, tecnicamente, não haveria qualquer necessidade de um separadas vtable para Derived.

No entanto, na prática, implementações, a estrutura de dados que nós normalmente chamamos de "vtable", muitas vezes tem alguns adicionais específicos de cada classe de informação bem.Que informação adicional é tão específicas da classe de que a maior parte do tempo, torna-se impossível compartilhar vtables entre as diferentes classes na hierarquia, mesmo se eles usam o mesmo conjunto de funções virtuais.Por exemplo, em algumas implementações, o vtable ponteiro armazenado em cada polimórficos objeto aponta para a estrutura de dados que armazena também os chamados "RTTI" informações sobre a classe.Por esta razão, na maioria (se não todos) prática implementações de cada polimórfico de classe obtém seu próprio vtable, mesmo se a função virtual ponteiros armazenados nas tabelas acontecer o mesmo.

Outras dicas

    .
  1. Um aplicativo Winrt (eu suponho que é o que você quer dizer com o metrô) será executado no desktop / tablet e teoricamente um dispositivo 8 do Windows Phone 8 sem alterações de código.Primeiro, observe que estamos falando sobre o Windows Phone 8 (não o atual Windows Phone 7) e que ele é executado, não que o layout da interface do usuário esteja exatamente certo.

  2. Você pode projetar o aplicativo, no entanto, você gosta, seja em conformidade com o design do metro ou algum outro olhar completamente.Se for desenvolvido no WinRT, ele deve ser compatível com o telefone também.

Sim, é verdade. Na verdade, dada a definição da base:

class derived:public base{
public:
 void print(){cout<<"derived print\n";}
};

é completamente equivalente a:

class derived:public base{
public:
 virtual void print(){cout<<"derived print\n";}
};

... porque você já definiu a impressão como virtual na base.

Eu gostaria que o compilador aplicasse isso ...

correção temporária está usando o iTunes para obter os arquivos da pasta do documento.

no seu .plist -> Informações Lista de propriedades -> Adicionar:

UIFileSharingEnabled (sim)

Reconstrua e vá para o iTunes e obtenha os arquivos da pasta do documento.

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