All Recipes
Home/constexpr/constexpr Virtual Functions
🔧advanced

constexpr Virtual Functions

Use polymorphism at compile time

Example Code

cpp
#include <iostream>
#include <memory>
// Base class with constexpr virtual
struct Shape {
constexpr virtual ~Shape() = default;
constexpr virtual double area() const = 0;
constexpr virtual const char* name() const = 0;
};
struct Circle : Shape {
double radius;
constexpr Circle(double r) : radius(r) {}
constexpr double area() const override {
return 3.14159 * radius * radius;
}
constexpr const char* name() const override {
return "Circle";
}
};
struct Square : Shape {
double side;
constexpr Square(double s) : side(s) {}
constexpr double area() const override {
return side * side;
}
constexpr const char* name() const override {
return "Square";
}
};
// Compile-time polymorphism
constexpr double total_area(const Shape& s1, const Shape& s2) {
return s1.area() + s2.area();
}
int main() {
constexpr Circle c{5.0};
constexpr Square s{4.0};
constexpr double total = total_area(c, s);
static_assert(total > 90.0 && total < 100.0);
std::cout << c.name() << " area: " << c.area() << std::endl;
std::cout << s.name() << " area: " << s.area() << std::endl;
std::cout << "Total: " << total << std::endl;
return 0;
}

Explanation

C++20 allows virtual functions to be constexpr, enabling polymorphism at compile time. This opens up new possibilities for type-safe, compile-time computed hierarchies.

Key Points

  • 1Virtual functions can be constexpr
  • 2Destructors can be constexpr virtual
  • 3Enables compile-time polymorphism
  • 4Works with references to base class