With inheritance, if the argument is of (1) class type, (2) a reference to class type, or (3) a pointer to class type, and (4) the class has base classes, the functions declared within the namespaces where the base classes are defined, and with the same name as the function called, are also added to the set of candidate functions.
#include <iostream>
namespace NS {
class ZooAnimal { };
void display(const ZooAnimal&);
}
void NS::display( const ZooAnimal& rz ){
std::cout << "NS::display( const ZooAnimal& )\n";
}
class Bear : public NS::ZooAnimal { };
int main(){
Bear bear;
display(bear);
return 0;
}
#include <iostream>
namespace NS {
class ZooAnimal {
friend void display(const ZooAnimal&);
};
void display(const ZooAnimal&);
}
void NS::display( const NS::ZooAnimal& rz ){
std::cout << "NS::display( const ZooAnimal& )\n";
}
class Bear : public NS::ZooAnimal { };
int main(){
Bear bear;
display(bear);
return 0;
}
#include <iostream>
#include <bits/stdc++.h>
class ZooAnimal {
public:
ZooAnimal ( const std::string& name ) : _name(name) {}
operator const char*(){
std::cout << "Calls conversion operator\n";
char* c_name = new char[ _name.length()+1 ];
std::strcpy( c_name, _name.c_str() );
return c_name;
}
std::string _name;
};
void display( const char* name ){
std::cout << name << "\n";
delete [] name;
}
class Bear : public ZooAnimal {
public:
Bear( const std::string& name ) : ZooAnimal( name ) {}
};
int main(){
Bear bear("my bear");
display(bear);
return 0;
}
class ZooAnimal { };
void display1( const ZooAnimal za ){ std::cout « “Converting an argument of a derived class type to a parameter of any of its base class types()\n”; } void display2( const ZooAnimal* za ){ std::cout « “Converting a pointer to a derived class type to a pointer to any of its base class types\n”; } void display3( const ZooAnimal& za ){ std::cout « “Initializing a reference to a base class type with an lvalue of a derived class type\n”; }
class Bear : public ZooAnimal { };
int main(){ Bear bear; Bear* ptr = &bear;
display1(bear);
display2(ptr);
display3(bear);
return 0; } ```
#include <iostream>
#include <bits/stdc++.h>
class ZooAnimal {
public:
ZooAnimal ( const std::string& name ) : _name(name) {}
operator const char*(){
std::cout << "Calls conversion operator\n";
char* c_name = new char[ _name.length()+1 ];
std::strcpy( c_name, _name.c_str() );
return c_name;
}
std::string _name;
};
void display( const char* name ){
std::cout << "Calls user-defined function\n";
delete [] name;
}
void display( const ZooAnimal& za ){
std::cout << "Calls display with standard conversion\n";
}
class Bear : public ZooAnimal {
public:
Bear( const std::string& name ) : ZooAnimal( name ) {}
};
int main(){
Bear bear("my bear");
display(bear);
return 0;
}
#include <iostream>
#include <bits/stdc++.h>
class ZooAnimal { };
class Bear : public ZooAnimal { };
void display( const Bear& ){
std::cout << "Calls display( const Bear& )\n";
}
void display( const ZooAnimal& ){
std::cout << "Calls display( const ZooAnimal& )\n";
}
int main(){
Bear bear;
display(bear);
return 0;
}
#include <iostream>
class ZooAnimal { };
class Bear : public ZooAnimal { };
void display( const Bear* ){
std::cout << "Calls display( const Bear* )\n";
}
void display( const ZooAnimal* ){
std::cout << "Calls display( const ZooAnimal* )\n";
}
int main(){
Bear bear;
display(&bear);
return 0;
}
void*
#include <iostream>
class ZooAnimal { };
class Bear : public ZooAnimal { };
void display( Bear* ){
std::cout << "Calls display( Bear* )\n";
}
void display( void* ){
std::cout << "Calls display( void* )\n";
}
int main(){
Bear bear;
display(&bear);
return 0;
}
#include <iostream>
class ZooAnimal { };
class Endangered : virtual public ZooAnimal {};
class Bear : virtual public ZooAnimal { };
class Panda : public Bear, public Endangered {};
void display( const Bear& ){
std::cout << "Calls display( Bear& )\n";
}
void display( const Endangered& ){
std::cout << "Calls display( Endangered& )\n";
}
int main(){
Panda p;
// Error: ambiguous
display(p);
// Ok
display(static_cast<Bear>(p));
return 0;
}
#include <iostream>
class ZooAnimal { };
class Bear : public ZooAnimal { };
void display( const Bear& ){
std::cout << "Calls display( Bear& )\n";
}
int main(){
ZooAnimal za;
display( za );
return 0;
}