在C++中,基類(base class)指針和引用可以用來指向或引用派生類(derived class)對象。這種轉換通常稱為“向上轉型”(upcasting),因為它將派生類對象的指針或引用轉換為基類指針或引用。向上轉型是安全的,因為基類指針或引用可以訪問派生類對象的基類部分。
以下是一個簡單的示例:
#include<iostream>
class Base {
public:
virtual void print() const {
std::cout << "Base"<< std::endl;
}
};
class Derived : public Base {
public:
void print() const override {
std::cout << "Derived"<< std::endl;
}
};
int main() {
Derived derived;
Base* basePtr = &derived; // 基類指針指向派生類對象
Base& baseRef = derived; // 基類引用引用派生類對象
basePtr->print(); // 輸出 "Derived"
baseRef.print(); // 輸出 "Derived"
return 0;
}
在這個示例中,我們有一個基類Base
和一個派生類Derived
。我們創建了一個Derived
對象,并將其地址賦給基類指針basePtr
,同時將其引用賦給基類引用baseRef
。當我們調用basePtr->print()
和baseRef.print()
時,實際上調用的是派生類的print()
方法,因為它被標記為override
,并且基類的print()
方法是虛函數。
需要注意的是,如果基類中的成員函數不是虛函數,那么基類指針或引用調用該成員函數時將不會調用派生類的重寫版本。在這種情況下,你需要將基類成員函數聲明為虛函數,以便在運行時正確地調用派生類的版本。