首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 虛表演示:虛函數覆蓋與菱形繼承內存佈局

     編輯:關於C++

代碼演示

#include 
#include 
using namespace std;

class Person {
public:
    Person(const string& n="") : _name(n) {}
    virtual ~Person() {}
    virtual void Display() { cout << "person\n"; }
protected:
    string _name;
};

class Student : public Person {
public:
    Student(const string& n, int num) : Person(n), _num(num) {}
    virtual void Display() override { cout << "student\n"; }
protected:
    int _num;
};

void Test() {
    Person p1("頭頭");
    Person* p2 = &p1;
    p1.Display(); p2->Display();          // person, person

    Student s1("大頭", 4130905);
    p2 = &s1;
    s1.Display(); p2->Display();          // student, student (多態生效)
}

int main() { Test(); return 0; }

關鍵點

  1. 基類析構函數 必須 virtual,否則 delete basePtr 不調用派生類析構。
  2. 派生類覆蓋虛函數建議加 override(C++11),編譯器檢查簽名一致性。
  3. 基類指針指向派生對象,vptr 指向派生類虛表,調用派生類覆蓋版本。

菱形繼承補充(註釋代碼)

註釋部分展示虛繼承解決菱形問題:virtual public Botany 使 Tree、Flower 共享同一 Botany 子對象,MicheliaAlba 構造函數需顯式調用虛基類構造函數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved