Virtual function: có cài đặt mặc định ở base class, class con có thể override.
Pure virtual function (= 0): không có cài đặt ở base class, class con bắt buộc override. Class chứa pure virtual → abstract class, không thể tạo instance trực tiếp.
cpp
class Shape {
public:
virtual void draw() { std::cout << "Generic shape"; } // virtual — có default
virtual double area() = 0; // pure virtual — bắt buộc override
virtual ~Shape() {} // virtual destructor — bắt buộc khi có virtual method
};
class Circle : public Shape {
double r;
public:
Circle(double r) : r(r) {}
double area() override { return 3.14 * r * r; }
// draw() không override → dùng bản của Shape
};
Shape* c = new Circle(5);
c->area(); // Circle::area qua vtableVirtual function: has a default implementation in the base class; derived classes may override it.
Pure virtual function (= 0): no base-class implementation; derived classes must override it. A class with any pure virtual becomes an abstract class — it cannot be instantiated.
cpp
class Shape {
public:
virtual void draw() { std::cout << "Generic shape"; } // has default
virtual double area() = 0; // must override
virtual ~Shape() {} // required when virtual methods present
};
class Circle : public Shape {
double r;
public:
Circle(double r) : r(r) {}
double area() override { return 3.14 * r * r; }
// draw() uses Shape's version
};
Shape* c = new Circle(5);
c->area(); // dispatched to Circle::area via vtable