Tabela Virtual C++
-
24-09-2019 - |
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 ?
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
- .
-
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.
-
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.