Seite 1 von 1

C++ Mehrfachvererbung mit gleichen Membermethoden

Verfasst: 02.07.2013, 13:02
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?

Re: C++ Mehrfachvererbung mit gleichen Membermethoden

Verfasst: 02.07.2013, 13:23
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.

Re: C++ Mehrfachvererbung mit gleichen Membermethoden

Verfasst: 02.07.2013, 13:23
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)