C++
Beginner
1 min read
Pure Virtual Functions and Abstract Classes
Example
#include <iostream>
#include <string>
#include <vector>
#include <memory>
// Abstract base — defines the interface
class IRenderer {
public:
virtual ~IRenderer() = default;
virtual void beginFrame() = 0;
virtual void drawTriangle(float x, float y, float z) = 0;
virtual void endFrame() = 0;
// Non-pure helper that calls pure virtuals
void renderScene(const std::vector<float>& vertices) {
beginFrame();
for (std::size_t i = 0; i + 2 < vertices.size(); i += 3)
drawTriangle(vertices[i], vertices[i+1], vertices[i+2]);
endFrame();
}
};
// Concrete implementation A
class OpenGLRenderer : public IRenderer {
public:
void beginFrame() override { std::cout << "[GL] Begin frame\n"; }
void drawTriangle(float x, float y, float z) override {
std::cout << "[GL] Triangle (" << x<<","<<y<<","<<z<<")\n";
}
void endFrame() override { std::cout << "[GL] End frame\n"; }
};
// Concrete implementation B
class ConsoleRenderer : public IRenderer {
public:
void beginFrame() override { std::cout << "[CON] ---\n"; }
void drawTriangle(float x, float y, float z) override {
std::cout << "[CON] tri " << x<<" "<<y<<" "<<z<<"\n";
}
void endFrame() override { std::cout << "[CON] ---\n"; }
};
int main() {
std::vector<float> verts = {0,0,0, 1,0,0, 0,1,0};
std::unique_ptr<IRenderer> r = std::make_unique<OpenGLRenderer>();
r->renderScene(verts);
r = std::make_unique<ConsoleRenderer>();
r->renderScene(verts);
return 0;
}