Inheritance
Virtual Functions
Virtual functions let a base pointer call the derived class implementation.
Virtual Functions
virtual_functions.cpp
#include <iostream>
#include <string>
class Shape {
public:
virtual int measure() {
return 0;
}
virtual std::string name() {
return "shape";
}
};
class Square : public Shape {
private:
int side;
public:
Square(int size) {
side = size;
}
int measure() override {
return side * side;
}
std::string name() override {
return "square";
}
};
class Line : public Shape {
private:
int length;
public:
Line(int size) {
length = size;
}
int measure() override {
return length;
}
std::string name() override {
return "line";
}
};
int main() {
bool useSquare = ;
int size = ;
Square square(size);
Line line(size);
Shape* shape = &line;
if (useSquare) {
shape = □
}
std::cout << "shape=" << shape->name() << std::endl;
std::cout << "measure=" << shape->measure() << std::endl;
return 0;
}
#include <iostream>
#include <string>
class Shape {
public:
virtual int measure() {
return 0;
}
virtual std::string name() {
return "shape";
}
};
class Square : public Shape {
private:
int side;
public:
Square(int size) {
side = size;
}
int measure() override {
return side * side;
}
std::string name() override {
return "square";
}
};
class Line : public Shape {
private:
int length;
public:
Line(int size) {
length = size;
}
int measure() override {
return length;
}
std::string name() override {
return "line";
}
};
int main() {
bool useSquare = ;
int size = ;
Square square(size);
Line line(size);
Shape* shape = &line;
if (useSquare) {
shape = □
}
std::cout << "shape=" << shape->name() << std::endl;
std::cout << "measure=" << shape->measure() << std::endl;
return 0;
}
#include <iostream>
#include <string>
class Shape {
public:
virtual int measure() {
return 0;
}
virtual std::string name() {
return "shape";
}
};
class Square : public Shape {
private:
int side;
public:
Square(int size) {
side = size;
}
int measure() override {
return side * side;
}
std::string name() override {
return "square";
}
};
class Line : public Shape {
private:
int length;
public:
Line(int size) {
length = size;
}
int measure() override {
return length;
}
std::string name() override {
return "line";
}
};
int main() {
bool useSquare = ;
int size = ;
Square square(size);
Line line(size);
Shape* shape = &line;
if (useSquare) {
shape = □
}
std::cout << "shape=" << shape->name() << std::endl;
std::cout << "measure=" << shape->measure() << std::endl;
return 0;
}
#include <iostream>
#include <string>
class Shape {
public:
virtual int measure() {
return 0;
}
virtual std::string name() {
return "shape";
}
};
class Square : public Shape {
private:
int side;
public:
Square(int size) {
side = size;
}
int measure() override {
return side * side;
}
std::string name() override {
return "square";
}
};
class Line : public Shape {
private:
int length;
public:
Line(int size) {
length = size;
}
int measure() override {
return length;
}
std::string name() override {
return "line";
}
};
int main() {
bool useSquare = ;
int size = ;
Square square(size);
Line line(size);
Shape* shape = &line;
if (useSquare) {
shape = □
}
std::cout << "shape=" << shape->name() << std::endl;
std::cout << "measure=" << shape->measure() << std::endl;
return 0;
}
#include <iostream>
#include <string>
class Shape {
public:
virtual int measure() {
return 0;
}
virtual std::string name() {
return "shape";
}
};
class Square : public Shape {
private:
int side;
public:
Square(int size) {
side = size;
}
int measure() override {
return side * side;
}
std::string name() override {
return "square";
}
};
class Line : public Shape {
private:
int length;
public:
Line(int size) {
length = size;
}
int measure() override {
return length;
}
std::string name() override {
return "line";
}
};
int main() {
bool useSquare = ;
int size = ;
Square square(size);
Line line(size);
Shape* shape = &line;
if (useSquare) {
shape = □
}
std::cout << "shape=" << shape->name() << std::endl;
std::cout << "measure=" << shape->measure() << std::endl;
return 0;
}
#include <iostream>
#include <string>
class Shape {
public:
virtual int measure() {
return 0;
}
virtual std::string name() {
return "shape";
}
};
class Square : public Shape {
private:
int side;
public:
Square(int size) {
side = size;
}
int measure() override {
return side * side;
}
std::string name() override {
return "square";
}
};
class Line : public Shape {
private:
int length;
public:
Line(int size) {
length = size;
}
int measure() override {
return length;
}
std::string name() override {
return "line";
}
};
int main() {
bool useSquare = ;
int size = ;
Square square(size);
Line line(size);
Shape* shape = &line;
if (useSquare) {
shape = □
}
std::cout << "shape=" << shape->name() << std::endl;
std::cout << "measure=" << shape->measure() << std::endl;
return 0;
}
virtual
A `virtual` function can dispatch through a base pointer or reference at runtime.