<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>pamiętnik programisty &#187; wirtualność</title>
	<atom:link href="http://piotr.doniec.eu/devlog/tag/wirtualnosc/feed/" rel="self" type="application/rss+xml" />
	<link>http://piotr.doniec.eu/devlog</link>
	<description></description>
	<lastBuildDate>Thu, 05 Aug 2010 20:22:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Funkcje wirtualne w c++</title>
		<link>http://piotr.doniec.eu/devlog/2009/05/funkcje-wirtualne-w-c/</link>
		<comments>http://piotr.doniec.eu/devlog/2009/05/funkcje-wirtualne-w-c/#comments</comments>
		<pubDate>Fri, 15 May 2009 14:26:11 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[wirtualność]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=179</guid>
		<description><![CDATA[Mechanizm funkcji wirtualnych, występujący także pod nazwą &#8222;późnego wiązania&#8221;, jest bardzo ważny elementem języka programowania. Pozwala na wywołania innej wersji metody w zależności od obiektu na rzecz którego metoda jest wywoływana.  Największe zastosowanie funkcji wirtualnych to umożliwienie przechowywanie obiektów w kolekcjach jako obiektów klasy bazowej, a wywoływanie metod które dotyczą faktycznego typu obiektu. O ile]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Mechanizm funkcji wirtualnych, występujący także pod nazwą &#8222;późnego wiązania&#8221;, jest bardzo ważny elementem języka programowania. Pozwala na wywołania innej wersji metody w zależności od obiektu na rzecz którego metoda jest wywoływana.  Największe zastosowanie funkcji wirtualnych to umożliwienie przechowywanie obiektów w kolekcjach jako obiektów klasy bazowej, a wywoływanie metod które dotyczą faktycznego typu obiektu.<span id="more-179"></span><br />
O ile w przypadku funkcji niewirtualnych kompilator nie ma problemu z obliczeniem adresu funkcji w czasie kompilacji i konsolidacji, a wywołanie odnosi się do obliczonego statycznego adresu.<br />
W przypadku funkcji wirtualnych sprawa wygląda trochę inaczej, ponieważ funkcja którą należy wywołać zależy również od typu obiektu na rzecz którego następuje próba wywołania. Dlatego kompilator tworzy sobie dla każdej klasy tabelę wywołań funkcji wirtualnych v-table. Tabela jest tworzona 1 dla jednej klasy i jest wspólna dla wszystkich obiektów danej klasy. Tabela v-table jest tworzona tylko wtedy gdy została zadeklarowana przynajmniej jedna funkcja wirtualna. Każda klasa ma wskaźnik na tabelę funkcji wirtualnych z której korzysta kiedy ma wywołać metodę która została zadeklarowana jako wirtualna. Wskaźnik tablicy wirtualnej jest zazwyczaj pierwszym elementem obiektu. Wynikający z istnienia vtable narzut pamięciowy jest raczej skromny. Rozmiar obiektu rośnie o wielkość samego wskaźnika, czyli o 4KB a zapotrzebowanie całego programu jest wprost proporcjonalne do ilości funkcji wirtualnych.<br />
<img class="size-full wp-image-180 alignnone" title="ovp-fig6" src="http://piotr.doniec.eu/devlog/wp-content/uploads/2009/05/ovp-fig6.gif" alt="ovp-fig6" width="314" height="314" /></p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2009/05/funkcje-wirtualne-w-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Z C++ zagadka</title>
		<link>http://piotr.doniec.eu/devlog/2009/03/z-c-zagadka/</link>
		<comments>http://piotr.doniec.eu/devlog/2009/03/z-c-zagadka/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 10:29:17 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[tricky]]></category>
		<category><![CDATA[wirtualność]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=132</guid>
		<description><![CDATA[Na ostatnich inżynierskich targach pracy i praktytk trafiłem na dość trudny test z C++. Pojawiło się na nim zadanie co do którego miałem wątpliwości szczególnie że sprawdzający stwierdził że nie mam racji. Treść zapamiętałem i postanowiłem sprawdzić nie teoretycznie na kartce, ale po prostu jak się zachowa prawdziwy kompilator. Treść jest bardzo prosta, jaki będzie]]></description>
			<content:encoded><![CDATA[<p>Na ostatnich inżynierskich targach pracy i praktytk trafiłem na dość trudny test z C++. Pojawiło się na nim zadanie co do którego miałem wątpliwości szczególnie że sprawdzający stwierdził że nie mam racji. Treść zapamiętałem i postanowiłem sprawdzić nie teoretycznie na kartce, ale po prostu jak się zachowa prawdziwy kompilator. <span id="more-132"></span>Treść jest bardzo prosta, jaki będzie efekt kompilacji i uruchomienia poniższego kodu:</p>
<pre class="brush: cpp">
class A
{
public:
  A() {
    fun();
  }

  virtual void fun()  {
    std::cout &lt;&lt; &quot;A::fun&quot; &lt;&lt; std::endl;
  }

  void fun2()  {
    fun();
  }
};

class B : public A
{
  void fun()  {
    std::cout &lt;&lt; &quot;B::fun&quot; &lt;&lt; std::endl;
  }
};

int main() {
  A* a = new B();
}
</pre>
<p>Poprawna odpowiedź:<br />
<code>A::fun</code><br />
dlaczego? W konstruktorze nie działa wirtualność. Zatem to ja miałem racje !<br />
Za to gdyby dopisać jeszcze </p>
<pre class="brush: cpp">
a-&gt;fun2();
</pre>
<p>to byśmy zobaczyli już <code>B::fun</code>. Problem zapewne rzadko w praktyce występuje ale jest to genialne zadanie na wszelkiej maści testy mające sprawdzić zaawansowaną znajomość mechanizmów języka C++</p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2009/03/z-c-zagadka/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
