Function Overloading (Ad-hoc polymorphism) and default parameters definition of different functions with the same signature: void helloWorld() { cout << "Hello, World!"; } void helloWorld(string world) { cout << "Hello, " << world; } void helloWorld(float bla) { cout << "Hello" << bla; } // will give you "duplicate symbol" error: int helloWorld(float blabla) { cout << "Hello" << bla; } signature of a function is function name and all parameter types, NOT parameter names and NOT return type usage: helloWorld(); helloWorld("Welt"); helloWorld(static_cast(6)); helloWorld(6.0); Default parameters: void helloWorld2(string world="World") { cout << "Hello, " << world; } would act as if: void helloWorld2(string world) { cout << "Hello, " << world; } void helloWorld2() { helloWorld2("World"); } usage: helloWorld2(); // prints: Hello, World helloWorld2("Welt"); // prints: Hello, Welt int bla(int a, int b) { return a*b; } float bla(double a, double b) { return a/b; } int main() { cout << bla(1,2) << endl; // print 2 cout << bla(1,2.0) << endl; // ambigious call (in case of gcc 3.3) cout << bla(1.0,2.0) << endl; // print 0.5 return 0; }