[英]Is modifying a function in derived class and accessing it by derived class object itself an example of runtime polymorphism
我正在網上閱讀有關函數覆蓋和運行時多態性的信息。
在閱讀時,我發現了一個在programiz上覆蓋函數的示例,其中給出了以下示例:
// C++ program to demonstrate function overriding
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
}
};
int main() {
Derived derived1;
derived1.print();
return 0;
}
輸出
Derived Function
在Derived
類中,我們修改了Base
類的print()
函數,並由派生類的對象derived1
訪問。
一個問題一直縈繞在我的腦海中——這也是運行時多態性的一個例子嗎? 或運算符覆蓋並不總是屬於運行時多態性,因為我在某處讀過這個
虛函數的主要用途是實現運行時多態性。運行時多態性只能通過基類類型的指針(或引用)來實現。
因此,我的問題是——“這是運行時多態性的一個例子嗎,因為它不使用virtual
關鍵字,而是涉及一個指向基類的指針,甚至是一個函數覆蓋的例子?
如果我提到任何錯誤,請糾正我。
這不是運行時多態性。
該站點也沒有聲明,但它錯誤地使用了術語“覆蓋”(或者至少沒有使用通常的技術含義)。 只能覆蓋virtual
函數,然后覆蓋提供運行時多態性。
該站點演示的只是類成員的(編譯時靜態)名稱查找規則。 沒有多態性或覆蓋。 C++ 只允許在不同的命名空間和類中具有相同名稱的實體,並且有關於如何決定給定表達式名稱中的哪些實體的規則。 這些實體根本不相關。 例如,您可以有一個靜態數據成員static int mem;
在基類和非靜態成員函數中void mem();
在派生類中。 如果你寫obj.mem
它將是靜態數據成員(如果obj
的靜態類型是基類)或非靜態成員函數(如果obj
的靜態類型是派生類)。 這些顯然彼此無關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.