wymuszanie wywołania wirtualnego

0

Gdyby wywołania funkcji w stosunku do obiektu przekazywanego przez wartość nie podlegały wczesnemu wiązaniu, to wywołanie wirtualne mogłoby odwoływać się do nieistniejących części obiektu. Czy to możliwe? Napisz kod wymuszający wywołanie wirtualne i zobacz czy załamie to program.

Jak można wymusić wywołanie wirtualne opisane w zadaniu?

1

Gdyby wywołania funkcji w stosunku do obiektu przekazywanego przez wartość nie podlegały wczesnemu wiązaniu, to wywołanie wirtualne

Na mój rozum

#include <iostream>
using namespace std;

struct A{
	virtual void fun(){
		cout << "A" << endl;
	}
};

struct B : A{
	virtual void fun(){
		cout << "B" << endl;
	}
};


void do_fun(A a){
	a.fun();
}

int main() {
	B b;
	do_fun((A)b);
	return 0;
}

output:
A
(wynik z ideone)

0

Wg mnie to jest wymuszanie:

#include <iostream>
using namespace std;
 
struct Base
  {
   virtual void who() { cout<<"Base"<<endl; }
  };
 
struct Derived:public Base
  {
   virtual void who() { cout<<"Derived"<<endl; }
  };
 
int main()
  {
   Derived d;
   d.who();
   d.Base::who();
   Base b;
   ((Derived*)&b)->Derived::who(); // to może załamać
   return 0;
  }
0

ja nie kumam tych pytań po polsku nigdy, ale jeżeli chodzi tu o "slicing" to tak to działa jak pokazał @spartanPAGE, no i naturalnie nie musisz castować na A, bo B to A; tworzysz kopię A -> tracisz to co było w B

dopisałem jeszcze co się stanie jak podasz adres B

http://ideone.com/KLSIzP

0

@gośćabc, no właśnie te polskie nazwy.
To co podałeś nie jest wymuszaniem to jest normalna kopia.

0

Base b;
((Derived*)&b)->Derived::who();

To jest UB i nie ma się co za bardzo nad tematem rozwodzić...

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