Dynamic Cast - Ό,τι πιο άκυρο μπορεί να συμβεί...

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
avounotr
Δημοσιεύσεις: 4
Εγγραφή: 08 Μαρ 2012 16:01

Dynamic Cast - Ό,τι πιο άκυρο μπορεί να συμβεί...

Δημοσίευση από avounotr » 14 Αύγ 2012 13:23

Παιδιά παραθέτω παρακάτω δύο φορές έναν κώδικα.
Στις δύο περιπτώσεις το αποτέλεσμα είναι διαφορετικό ενώ η αλλαγή που γίνεται δεν είναι ουσιαστική.

Δείτε και πείτε μου τη γνώμη σας:

1ο πρόγραμμα:

Κώδικας:

Κώδικας: Επιλογή όλων

#include <iostream>
#include <string>

using namespace std;


class CBase &#123; 
	public&#58; 
		virtual void funct&#40;&#41;;
		//string str;
&#125;;

void CBase&#58;&#58;funct&#40;&#41; &#123;
	cout << "CBase\n";
&#125;

class CDerived&#58; public CBase &#123; 
	public&#58; 
		void funct&#40;&#41;;
&#125;;

void CDerived&#58;&#58;funct&#40;&#41; &#123;
	cout << "CDerived\n";
&#125;



int main &#40;&#41; &#123;
	
	CBase *pb;
	
	int k;
	k = 3;
	
	if &#40;k == 3&#41; &#123;
			
		CDerived d; 
		pb = dynamic_cast<CBase*>&#40;&d&#41;;     
		pb->funct&#40;&#41;;
	&#125;
	else &#123;
		CBase d; 
		pb = dynamic_cast<CBase*>&#40;&d&#41;; 
	&#125;
		
	
	pb->funct&#40;&#41;;
	
	return 0;
&#125;
Έξοδος:

Κώδικας: Επιλογή όλων

CDerived
CDerived

2ο πρόγραμμα:

Κώδικας:

Κώδικας: Επιλογή όλων

#include <iostream>
#include <string>

using namespace std;


class CBase &#123; 
	public&#58; 
		virtual void funct&#40;&#41;;
		string str;
&#125;;

void CBase&#58;&#58;funct&#40;&#41; &#123;
	cout << "CBase\n";
&#125;

class CDerived&#58; public CBase &#123; 
	public&#58; 
		void funct&#40;&#41;;
&#125;;

void CDerived&#58;&#58;funct&#40;&#41; &#123;
	cout << "CDerived\n";
&#125;



int main &#40;&#41; &#123;
	
	CBase *pb;
	
	int k;
	k = 3;
	
	if &#40;k == 3&#41; &#123;
			
		CDerived d; 
		pb = dynamic_cast<CBase*>&#40;&d&#41;;     
		pb->funct&#40;&#41;;
	&#125;
	else &#123;
		CBase d; 
		pb = dynamic_cast<CBase*>&#40;&d&#41;; 
	&#125;
		
	
	pb->funct&#40;&#41;;
	
	return 0;
&#125;

Έξοδος:

Κώδικας: Επιλογή όλων

CDerived
CBase

Η μοναδική διαφορά ανάμεσα στα δύο προγράμματα είναι ότι στο CBase έχει οριστεί και μια
μεταβλητή τύπου string. Αν αντί για string βάλω ό,τιδήποτε άλλο δεν υπάρχει πρόβλημα.


Μπορεί κανείς να μου το εξηγήσει αυτό;

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Dynamic Cast - Ό,τι πιο άκυρο μπορεί να συμβεί...

Δημοσίευση από dva_dev » 14 Αύγ 2012 21:56

Στην CDerived έχεις συγκεκριμένο λόγο που δεν έχεις κάνει τη func() virtual?
Γιατί δεν έχεις βάλει virtual destructors αφού έχεις virtual functions?
Γιατί χρησιμοποιείς pointer σε object το οποίο έχει καταστραφεί και περιέχει σκουπίδια? (έξω από την if/else).

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες