virtual ReturnType Func() = 0;,基類不提供實現,強制派生類覆寫。protected 構造函數(防止直接構造基類)。存在。雖然抽象類無對象,但編譯器仍為其生成虛表(含純虛函數條目),用於:
class Base {
Base() { nonVirtual(); } // 構造時調用
void nonVirtual() { pureVirtual(); } // 間接調用純虛
virtual void pureVirtual() = 0;
};
class Derived : public Base {
void pureVirtual() override {} // 實現
};
int main() { Derived d; } // Crash: pure virtual function called
原因:構造 Derived 時,先構造 Base 子對象,此時 vptr 指向 Base 虛表(純虛條目通常填入 __cxa_pure_virtual),調用純虛觸發運行時錯誤。規則:構造/析構函數中不要調用虛函數。
class Animal {
protected: Animal() {} // 防止直接構造
public:
virtual void eat(const string& food) = 0;
virtual ~Animal() {} // 虛析構函數!
};
class Dog : public Animal {
vector foodList;
void eat(const string& f) override {
if (binary_search(foodList.begin(), foodList.end(), f)) cout << "Yummy\n";
}
};
純虛類是 C++ 實現「接口」的核心機制。關鍵點:不可實例化、強制派生類實現、虛表仍存在、構造/析構中禁調虛函數、虛析構函數必備。正確使用能構建清晰、可擴展的多態體系。