ภาพรวม
ใน C++ Derived Class สามารถเรียก Function ของ Parent (Base) Class ได้โดยใช้ Scope Resolution Operator :: ระบุชื่อ Base Class ตามด้วย :: และชื่อฟังก์ชัน
Syntax
BaseClassName::functionName(arguments);
ตัวอย่างโค้ด
#include <iostream>
using namespace std;
class Base {
public:
void func() {
cout << "\nThe parent class Base function is called.";
}
};
class Derived : public Base {
public:
void func() { // Override Base::func()
cout << "The derived class Derived function is called.";
Base::func(); // เรียก Base Version ผ่าน ::
}
};
int main() {
Derived d;
d.func(); // เรียก Derived::func() ซึ่งเรียก Base::func() ต่อ
return 0;
}
ผลลัพธ์
The derived class Derived function is called.
The parent class Base function is called.
กรณีการใช้งานทั่วไป
1. Constructor Chaining
class Base {
int id_;
public:
Base(int id) : id_(id) { cout << "Base constructed: " << id_ << "\n"; }
};
class Derived : public Base {
string name_;
public:
Derived(int id, string name) : Base(id), name_(move(name)) {
cout << "Derived constructed: " << name_ << "\n";
}
};
2. Destructor Chaining (Automatic)
class Base {
public:
virtual ~Base() { cout << "Base destroyed\n"; }
};
class Derived : public Base {
public:
~Derived() override {
cout << "Derived destroyed\n";
// Base::~Base() เรียกอัตโนมัติหลัง Derived::~Derived()
}
};
3. Extending Base Behavior (Template Method Pattern)
class Logger {
public:
virtual void log(const string& msg) {
cout << "[LOG] " << msg << "\n";
}
};
class TimestampLogger : public Logger {
public:
void log(const string& msg) override {
auto now = chrono::system_clock::now();
auto time = chrono::system_clock::to_time_t(now);
string timestamp = ctime(&time);
timestamp.pop_back(); // Remove newline
Logger::log("[" + timestamp + "] " + msg); // Call Base
}
};
4. Overloaded Functions (Name Hiding)
class Base {
public:
void func(int x) { cout << "Base::func(int): " << x << "\n"; }
void func(double x) { cout << "Base::func(double): " << x << "\n"; }
};
class Derived : public Base {
public:
using Base::func; // Import Base Overloads! (Important!)
void func(string s) {
cout << "Derived::func(string): " << s << "\n";
}
};
int main() {
Derived d;
d.func(42); // Base::func(int) - ต้องมี using Base::func
d.func(3.14); // Base::func(double)
d.func("hello"); // Derived::func(string)
}
Virtual Functions และ Override
class Base {
public:
virtual void process() {
cout << "Base processing\n";
// Common logic...
}
};
class Derived : public Base {
public:
void process() override {
Base::process(); // เรียก Base Version ก่อน/หลัง Custom Logic
cout << "Derived additional processing\n";
}
};
ข้อควรระวัง
- Name Hiding: Derived Class ฟังก์ชันชื่อเดียวกันจะซ่อน Base Overloads ทั้งหมด → ใช้
using Base::func; - Private Base Functions: เรียกไม่ได้จาก Derived (แต่ Virtual Private Override ได้ - Rare)
- Constructor/Destructor: ไม่ใช่ Virtual (แต่ Destructor ควรเป็น Virtual)
- Multiple Inheritance: ต้องระบุ Base Class ชัดเจน
Base1::func(),Base2::func()
สรุป
- ใช้
BaseClass::function()เพื่อเรียก Base Version - พบบ่อยใน: Constructor Chaining, Override Extension, Template Method Pattern
- จำเป็นต้องใช้เมื่อ Override และต้องการ Base Behavior ด้วย
- Virtual Functions: ใช้
overridekeyword (C++11) เพื่อความปลอดภัย