pure virtual examples
Example 1: pure virtual function in c++
#include <iostream>
#include <string>
//Pure virtual function or inteface allows us to define a function in a base class that doesn't have an implementation or definition in the base class and force sub classes to implement that function
//Pure virtual function is also called an interface in other languages
class Entity {
public:
//virtual std::string GetName() { return "Entity"; }//This is a function that is just virtual .Overriding this function in sub class is optional we can instantiate subcllass without overriding or implementing this function
//Below is an example a Pure Virtual Function
//It is an unimplemented function ant it forces the sub class to implement it and define it
//You will not be able to instantiate sub class without implementing or defining the function in sub class
virtual std::string GetName() = 0;
//the pure virtual function must have virtual written at the beginning and =0 at the end
//This function cannot contain any definition in base class,it is just a declaration
};
class Player :public Entity {
std::string m_name;
public:
Player(const std::string& name)
:m_name(name)
{};
void Print() { std::cout << "This is Sub class" << std::endl; };
std::string GetName()override { return m_name; };//Pure virtual functions is implemented here in this sub class
};
void PrintName(Entity* entity) {
std::cout << entity->GetName() << std::endl;
}
int main()
{
//Entity a;//We can't do this because class Entity contains function that is unimplemented
Player x("Jacob");//This will work because we have implemented or defined the function in this sub class
std::cin.get();
}
Example 2: abstract class in c++
struct Abstract {
virtual void f() = 0; // pure virtual
}; // "Abstract" is abstract
struct Concrete : Abstract {
void f() override {} // non-pure virtual
virtual void g(); // non-pure virtual
}; // "Concrete" is non-abstract
struct Abstract2 : Concrete {
void g() override = 0; // pure virtual overrider
}; // "Abstract2" is abstract
int main()
{
// Abstract a; // Error: abstract class
Concrete b; // OK
Abstract& a = b; // OK to reference abstract base
a.f(); // virtual dispatch to Concrete::f()
// Abstract2 a2; // Error: abstract class (final overrider of g() is pure)
}