Skip to content

Instantly share code, notes, and snippets.

@peterhellberg
Last active August 15, 2025 21:23
Show Gist options
  • Save peterhellberg/01d3b75fe3a36ceec5b9070df51b7218 to your computer and use it in GitHub Desktop.
Save peterhellberg/01d3b75fe3a36ceec5b9070df51b7218 to your computer and use it in GitHub Desktop.
Example of behavioral change when using `virtual` in C++
#include <print>
using namespace std;
class GenericGreeter {
public:
void Greet(const char* name) {
println("Hi {}.", name);
}
};
class FriendlyGreeter : public GenericGreeter {
public:
void Greet(const char* name) {
println("Hello {}! It's a pleasure to meet you!", name);
}
};
int main() {
FriendlyGreeter* friendlyGreeter = new FriendlyGreeter;
GenericGreeter* genericGreeter = (GenericGreeter*)friendlyGreeter;
friendlyGreeter->Greet("Bob");
genericGreeter->Greet("Alice");
delete friendlyGreeter;
return 0;
}
.PHONY: all
all: build run
CXX := $(or $(CXX),zig c++)
.PHONY: build
build:
${CXX} -std=c++23 -o greeter greeter.cpp
${CXX} -std=c++23 -o virtual virtual.cpp
.PHONY: run
run:
./greeter
./virtual
.PHONY: clean
clean:
rm -f ./greeter
rm -f ./virtual
#include <print>
using namespace std;
class GenericGreeter {
public:
virtual void Greet(const char* name) {
println("Hi {}.", name);
}
};
class FriendlyGreeter : public GenericGreeter {
public:
virtual void Greet(const char* name) {
println("Hello {}! It's a pleasure to meet you!", name);
}
};
int main() {
FriendlyGreeter* friendlyGreeter = new FriendlyGreeter;
GenericGreeter* genericGreeter = (GenericGreeter*)friendlyGreeter;
friendlyGreeter->Greet("Bob");
genericGreeter->Greet("Alice");
delete friendlyGreeter;
return 0;
}
@peterhellberg
Copy link
Author

7c7
<   void Greet(const char* name) {
---
>   virtual void Greet(const char* name) {
14c14
<   void Greet(const char* name) {
---
>   virtual void Greet(const char* name) {

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment