Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Εχουμε τουτο

struct IPublicInterface
{
	virtual void Func1() = 0;
};
//////////////////////////
struct IInternalInterface:
	public IPublicInterface
{
	virtual void Func2() = 0;
};
/////////////////////////
struct InternalDispacher
{
	virtual void Fire()
	{
		this->OnSomthing();
	}
	virtual void OnSomthing()
	{
	}
};
///////////////////////

struct SomeAbstract:
	public IInternalInterface,
	public InternalDispacher
{
	//public interface imp
	virtual void Func1()
	{
		std::cout<<"SomeAbstract::Func1()"<<std::endl;
	}
	//internal interface imp
	virtual void Func2()
	{
		std::cout<<"SomeAbstract::Func2()"<<std::endl;
	}
	//dispacher override
	virtual void OnSomthing() override
	{
		std::cout<<"SomeAbstract::OnSomthing()"<<std::endl;
	}
	virtual void Foo() = 0;
};

//////////////////////
struct JustAClass:
	public SomeAbstract
{
	//override dispacher
	virtual void OnSomthing() override
	{
		std::cout<<"JustAClass::OnSomthing()"<<std::endl;
	}
	//imp abstract
	virtual void Foo()
	{
	}
};


int main()
{
	IPublicInterface *obj = new JustAClass;
	
	obj->Func1();
	((IInternalInterface*)obj)->Func2();
	((InternalDispacher*)obj)->Fire();//<----
	((SomeAbstract*)obj)->Fire();
	((JustAClass*)obj)->Fire();
	
	return 0;
}

το αποτελεσμα

post-216584-0-18868300-1384647965_thumb.png

Γιατι; Αφου το jsutaclass ειν απανω απο το internaldispacher.

 

Δημοσ.

Μήπως καποιο C++11 feature που δεν υποστηριζει το VS?

Σε g++ δεν εχω θεμα: http://i.imgur.com/HAQbKL3.png

Αυτο ειναι λαθος αποτελεσμα. Το ((InternalDispacher*)obj)->Fire(); υποτιθεται οτι πρεπει να καλεσει την OnSomthing της JustAClass, αλα και σ'εσενα καλει την Func1 της someabstract

Δημοσ.

Όντως. Εχεις μονο μια Fire, αρα θα επρεπε να μπει εκει μέσα, παρ'όλα αυτά αν βαλω ενα cout στην Fire δεν θα το τυπωσει στην 3η περιπτωση που εχεις το προβλημα.

Δημοσ.

Ρε συ παπί εγώ δεν κατάλαβα τι πρέπει να δούμε στο screenshot...

Οτι η γραμμη 78 εχει ενα call που παει στο γαμο του καραγκιοζη. Καλω την Fire, και αντι να πει εκει, παει στην func1 Που δεν εχει καμια σχεση. Βασικα εχει σχεση, ειναι πρωτη στο vtable.

 

εδιτ. Το βρηκα. Φταιει το static cast. Με dynamic δουλευει gg.  Κοιτα να δεις τι μαθαινεις στα καλα καθουμενα, εγω νομιζα οτι τα *_cast ειναι απλα "checkers"... τελεικα δεν ειναι, το dynamic κανει και "manipulation" του vtable/pointer whateva

int main()
{
	IPublicInterface *obj = new JustAClass;
	
	SomeAbstract *abst = dynamic_cast<SomeAbstract*>( obj );//ok
	abst->Fire();//ok
	InternalDispacher *disp = dynamic_cast<InternalDispacher*>( abst );//ok
	disp->Fire();//ok
	InternalDispacher *disp1 = dynamic_cast<InternalDispacher*> ( obj );
	disp1->Fire();
	InternalDispacher *disp2 = (InternalDispacher*) ( obj );//ok
	disp2->Fire();//fail
	if(disp2 != disp1)
	{
		std::cout<<"To idio reference, me diaforetiko reference :P";
	}


	/*
	obj->Func1();
	((IInternalInterface*)obj)->Func2();
	((InternalDispacher*)obj)->Fire();//<----
	((SomeAbstract*)obj)->Fire();
	((JustAClass*)obj)->Fire();
	*/
	
	return 0;
}
  • Like 1
Δημοσ.

Γιατί χρησιμοποιείς ακόμα C-style casts; Τα C-style casts μπορεί να καταλήξουν να κάνουν reinterpret_cast μερικές φορές (και οι κανόνες δεν είναι οι πιο καθαροί πότε γίνεται αυτό).

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...