Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

วิธีเรียก Parent Class Function จาก Derived Class ใน C++

ภาพรวม

ใน 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: ใช้ override keyword (C++11) เพื่อความปลอดภัย