<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Problem mit Mehrfachvererbung]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich arbeite gerade an einer GUI Library die mir die Arbeit mit WindowApplications erleichtern soll.<br />
Das soll natürlich alles komplett ObjektOrientiert sein.<br />
Nun habe mehrere Klassen wie &quot;IWindow&quot;, &quot;IGadget&quot;. Diese beiden Klassen sollen später einige Funktionen haben, die exakt das gleiche machen. z.B. &quot;SetPosition()&quot;. Damit ich solche Funktionen nicht immer wieder schreiben bzw. kopieren muss - das wäre ja sonst unschön - möchte ich das für eine Unter-Klasse machen.<br />
Das ist ja noch sehr leicht, allerdings habe ich das alles mit &quot;I&quot;-Klassen, also Interfaces gemacht. Die eigentlichen Win32API oder X11 Funktionen werden in den &quot;C&quot;-Klassen aufgerufen. Das hat verschiedene Gründe warum ich das mache.<br />
Das heißt das sieht das grob so aus:</p>
<pre><code class="language-cpp">// Basic sub-class

class IBasicObject
{
    public:
        virtual void SetPosition(int X, int Y) = 0;
};

// Interface classes

class IWindow : public IBasicObject
{
    public:
        virtual void Minimize(); // Function only for windows
};

class IController : public IBasicObject
{
    public:
        virtual void SetState(); // Function only for controllers
};

// Final used classes:

class API CWindow : public IWindow
{
    public:
        void SetPosition(int X, int Y);
        void Minimize();
    private:
        HWND Handle;
};

class API CController : public Controller
{
    public:
        void SetPosition(int Y, int Y); // redundant
        void SetState();
    private:
        HWND Handle; // redundant
};

// Program ( int main() { ... )

IWindow* MyWindow = new CWindow();
IController* MyButton = new CController();
</code></pre>
<p>Nun will ich eine weitere Klasse Namens &quot;CBasicObject&quot; erstellen die wie folgt aussieht:</p>
<pre><code class="language-cpp">class API CBasicObject : public IBasicObject
{
    public:
        void SetPosition();
    protected:
        HWND Handle;
};

class API CWindow : public CBasicObject, public IWindow
{
    ...
};
</code></pre>
<p>Das Problem ist aber jetzt, dass IBasicObject zwei mal aufgerufen wird.<br />
Einmal in CBasicObject und ein mal in IWindow.</p>
<p>Wie kann ich das am besten machen, dass ich Funktionen wie &quot;SetPosition&quot; und Komponenten wie &quot;HWND Handle&quot; nur einmal programmieren muss??</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/253319/problem-mit-mehrfachvererbung</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 23:26:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/253319.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 31 Oct 2009 16:15:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Mehrfachvererbung on Sat, 31 Oct 2009 16:15:14 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich arbeite gerade an einer GUI Library die mir die Arbeit mit WindowApplications erleichtern soll.<br />
Das soll natürlich alles komplett ObjektOrientiert sein.<br />
Nun habe mehrere Klassen wie &quot;IWindow&quot;, &quot;IGadget&quot;. Diese beiden Klassen sollen später einige Funktionen haben, die exakt das gleiche machen. z.B. &quot;SetPosition()&quot;. Damit ich solche Funktionen nicht immer wieder schreiben bzw. kopieren muss - das wäre ja sonst unschön - möchte ich das für eine Unter-Klasse machen.<br />
Das ist ja noch sehr leicht, allerdings habe ich das alles mit &quot;I&quot;-Klassen, also Interfaces gemacht. Die eigentlichen Win32API oder X11 Funktionen werden in den &quot;C&quot;-Klassen aufgerufen. Das hat verschiedene Gründe warum ich das mache.<br />
Das heißt das sieht das grob so aus:</p>
<pre><code class="language-cpp">// Basic sub-class

class IBasicObject
{
    public:
        virtual void SetPosition(int X, int Y) = 0;
};

// Interface classes

class IWindow : public IBasicObject
{
    public:
        virtual void Minimize(); // Function only for windows
};

class IController : public IBasicObject
{
    public:
        virtual void SetState(); // Function only for controllers
};

// Final used classes:

class API CWindow : public IWindow
{
    public:
        void SetPosition(int X, int Y);
        void Minimize();
    private:
        HWND Handle;
};

class API CController : public Controller
{
    public:
        void SetPosition(int Y, int Y); // redundant
        void SetState();
    private:
        HWND Handle; // redundant
};

// Program ( int main() { ... )

IWindow* MyWindow = new CWindow();
IController* MyButton = new CController();
</code></pre>
<p>Nun will ich eine weitere Klasse Namens &quot;CBasicObject&quot; erstellen die wie folgt aussieht:</p>
<pre><code class="language-cpp">class API CBasicObject : public IBasicObject
{
    public:
        void SetPosition();
    protected:
        HWND Handle;
};

class API CWindow : public CBasicObject, public IWindow
{
    ...
};
</code></pre>
<p>Das Problem ist aber jetzt, dass IBasicObject zwei mal aufgerufen wird.<br />
Einmal in CBasicObject und ein mal in IWindow.</p>
<p>Wie kann ich das am besten machen, dass ich Funktionen wie &quot;SetPosition&quot; und Komponenten wie &quot;HWND Handle&quot; nur einmal programmieren muss??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1801249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1801249</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Sat, 31 Oct 2009 16:15:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Mehrfachvererbung on Sat, 31 Oct 2009 16:23:20 GMT]]></title><description><![CDATA[<p>Ich gehe mit einer ähnlichen Struktur in meinem 2D-Spiel.<br />
Allerdings vermeide ich gezielt Mehrfachvererbung, also dass eine Klasse von mehreren Klassen erbt.<br />
Aber ich würde einfach alles aus BasisObject werfen was nicht mehrfach vorkommen darf und das dann in einem anderen Interface unterbringen und nur einmal vererben an die Interface-Klassen die das brauchen.<br />
Mehrfacherbung sollte man immer vermeiden.<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1801255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1801255</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 31 Oct 2009 16:23:20 GMT</pubDate></item></channel></rss>