C++ Mehrfachvererbung mit gleichen Membermethoden

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Matthias Gubisch
Establishment
Beiträge: 507
Registriert: 01.03.2009, 19:09

C++ Mehrfachvererbung mit gleichen Membermethoden

Beitrag von Matthias Gubisch »

Die Frage hat erstmal keinen praktischen Hintergrund sondern entstand mehr aus einer theoretischen überlegung heraus.

Code: Alles auswählen

#include <iostream>

class B1
{
public:
  B1(void) {}
  ~B1(void){}

  virtual void who() {
    std::cout << "B1" << std::endl;
  }
};

class B2
{
public:
  B2(void) {}
  ~B2(void){}

  virtual void who() {
    std::cout << "B2" << std::endl;
  }
};

class Derived: public B1, B2
{
public:
  Derived(void) {}
  ~Derived(void){}
 };


int main(void) {
  	Derived d;

        d.who()
}
Beim Aufruf von d.who() meckert der compiler logischerweise dass er den Aufruf wegen Mehrdeutigkeit nicht auflösen kann.
Meine Frage jezt: Was wäre hier der Ideale weg dem Compiler zu sagen welche Basisimplementierung er aufrufen soll.

Spontan fällt mir ein:
Die abgeleitete Klasse auf die entsprechende Basisklasse casten -> nicht schön aber funktioniert

Die Mehtode who() in der abgeleiteten Klasse so implementieren das die entsprechende Basismethode aufgerufen wird.

Kennt jemand noch weitere Möglichkeiten solche Mehrdeutigkeiten möglichst elegant aufzulösen?
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Schrompf
Moderator
Beiträge: 5164
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: C++ Mehrfachvererbung mit gleichen Membermethoden

Beitrag von Schrompf »

Gibt's da nicht diesen absurden Syntax mit dem Scope Operator. So hier vielleicht:

Code: Alles auswählen

d.B2::who();
Oder so ähnlich? Hab's jetzt nicht ausprobiert.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
RustySpoon
Establishment
Beiträge: 298
Registriert: 17.03.2009, 13:59
Wohnort: Dresden

Re: C++ Mehrfachvererbung mit gleichen Membermethoden

Beitrag von RustySpoon »

Einfach die gewünschte Basisklassen-Implementierung mittels ::-Operator qualifzieren.

Alternativ kannst du das auch via Template-Parameter lösen:

Code: Alles auswählen

#include <iostream>
 
class B1
{
public:
  B1(void) {}
  ~B1(void){}
 
  virtual void who() {
    std::cout << "B1" << std::endl;
  }
};
 
class B2
{
public:
  B2(void) {}
  ~B2(void){}
 
  virtual void who() {
    std::cout << "B2" << std::endl;
  }
};
 
class Derived: public B1, B2
{
public:
  Derived(void) {}
  ~Derived(void){}
  
  template<typename Base>
  void who() {
      Base::who();
  }
 };
 
 
int main(void) {
        Derived d;
 
        d.who<B1>();
}
(Ideone)
Antworten