Dziedziczenie wirtualne - dlaczego tak to działa

0
#include <iostream>
using namespace std;

struct B {
	virtual int f() {return 1;}
};
struct D1 : virtual public B {
	virtual int f(){return 2;}
};
struct D2 :  virtual public B{};
struct M : public D1, public D2 {
	virtual int f() {return 3;}
};

int main()
{
	M m;
	D1 *d1 = &m;
	cout << m.f();
	cout << d1->f();
	cout << static_cast<D2&>(m).f();
	cout << static_cast<B&>(m).f();
	return 0;
}

Dlaczego ta ostatnia linijka, tj. cout << static_cast<B&>(m).f(); daje output równy 3, a nie 1? Jak usunie się dziedziczenie wirtualne, to wtedy program się nawet nie skompiluje (ok, to rozumiem czemu, ale dlaczego f() nie sięga na samą górę hierarchii)? I w sumie to samo pytanie mógłbym zadać do cout << static_cast<D2&>(m).f();, czemu tutaj znowu zostaje przy jedynce

2

Nie do końca rozumiem w czym problem. Na tym polega polimorfizm dynamiczny - wywołana zostaje funkcja dla dynamicznego typu obiektu. Powyższy program wypisuje 3333: https://wandbox.org/permlink/xNqMkewljefxzAVP

0

Wyrzućmy z kodu rzeczy niemające związku z wynikiem:

#include <iostream>
using namespace std;
 
struct B {
    virtual int f() {return 1;}
};

struct M : public B {
    virtual int f() {return 3;}
};

int main()
{
    M m;
    cout << static_cast<B&>(m).f();
    return 0;
}

Wynik jest jaki jest bo tak ma być, gdyby było inaczej to jaki sens miałyby funkcje wirtualne?

1 użytkowników online, w tym zalogowanych: 0, gości: 1