Created
December 14, 2012 12:15
-
-
Save anonymous/4285044 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* @link http://stackoverflow.com/questions/13600934/why-is-the-virtual-keyword-needed | |
* @author Alan Johnson | |
* > Hi, | |
* > | |
* > Can someone explain to me what static and dynamic dispatch are and what | |
* > the difference is between the two? Do this even occurr in C++? | |
* > | |
* > Thanks | |
* | |
* In the context of C++, "dispatch" is just a fancy name for calling a | |
* member function. A "static" dispatch is one where all the type | |
* information needed to decide which function to call is known at compile | |
* time. Consider the following example: | |
*/ | |
#include <iostream> | |
class A | |
{ | |
public: | |
void f() const { std::cout << "A::f()" << std::endl ; } | |
} ; | |
class B | |
{ | |
public: | |
void f() const { std::cout << "B::f()" << std::endl ; } | |
} ; | |
int main() | |
{ | |
A a ; | |
B b ; | |
a.f() ; | |
b.f() ; | |
} | |
/* | |
* Here, the compiler has all the type information needed to figure out | |
* which function "f" to call in each case. In the first call, A::f is | |
* called, and in the second, B::f is called. | |
* | |
* Dynamic dispatching is needed when it cannot be determined until runtime | |
* which function to call. In C++, this is implemented using virtual | |
* functions. Consider the following: | |
*/ | |
#include <iostream> | |
class base | |
{ | |
public: | |
virtual void f() const = 0 ; | |
virtual ~base() {} | |
} ; | |
class A : public base | |
{ | |
public: | |
virtual void f() const { std::cout << "A::f()" << std::endl ; } | |
} ; | |
class B : public base | |
{ | |
public: | |
virtual void f() const { std::cout << "B::f()" << std::endl ; } | |
} ; | |
void dispatch(const base & x) | |
{ | |
x.f() ; | |
} | |
int main() | |
{ | |
A a ; | |
B b ; | |
dispatch(a) ; | |
dispatch(b) ; | |
} | |
// The line "x.f() ;" gets executed twice, but a different function gets | |
// called each time. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment