Architecture Diagram
OBJECT IN MEMORY:
┌─────────────────┐
│ vptr (8 bytes) ├───► [ VTABLE FOR DERIVED CLASS ]
│ derivedData │ ├─ 0: &Derived::vfunc1()
└─────────────────┘ └─ 1: &Base::vfunc2()OBJECT IN MEMORY:
┌─────────────────┐
│ vptr (8 bytes) ├───► [ VTABLE FOR DERIVED CLASS ]
│ derivedData │ ├─ 0: &Derived::vfunc1()
└─────────────────┘ └─ 1: &Base::vfunc2()override: Tells the compiler this function MUST override a virtual function in a base class. Catches typo bugs.final: Declares that a virtual function cannot be overridden in any further derived class, or that a class cannot be inherited.#include <iostream>
#include <vector>
#include <memory>
class AudioProcessor {
public:
virtual ~AudioProcessor() = default;
virtual void processBuffer(float* buffer, int samples) {
std::cout << "[Base] Processing raw audio buffer (" << samples << " samples)\n";
}
};
class ReverbEffect : public AudioProcessor {
public:
// override guarantees base signature matches
void processBuffer(float* buffer, int samples) override {
std::cout << "[ReverbEffect] Applying spatial acoustic convolution (" << samples << " samples)\n";
}
};
class LimiterEffect final : public AudioProcessor {
public:
void processBuffer(float* buffer, int samples) final {
std::cout << "[LimiterEffect] Clamping peaks to 0dB ceiling (" << samples << " samples)\n";
}
};
int main() {
std::vector<std::unique_ptr<AudioProcessor>> rack;
rack.push_back(std::make_unique<AudioProcessor>());
rack.push_back(std::make_unique<ReverbEffect>());
rack.push_back(std::make_unique<LimiterEffect>());
float dummyBuffer[64];
for (const auto& effect : rack) {
effect->processBuffer(dummyBuffer, 64);
}
return 0;
}override to every virtual member function override.final when creating terminal leaf classes to enable the compiler to perform devirtualization optimizations.