簡體   English   中英

派生類中的虛函數

[英]Virtual Functions in Derived Classes

看了幾個視頻,才知道虛擬function調用是如何通過后期綁定處理的。

在早期綁定中,對於像ptr->func(...)這樣的行,編譯器檢查ptr的數據類型並在相應的 class 中查找func(...)定義。

而虛函數后期綁定時,會訪問ptr地址,然后在對應的class中查找定義。

如果我對剛才提到的機制是正確的,那么為什么下面的代碼會產生錯誤?

class A{
   public:
       void func(){
       }
};

class B: public A{
    public:
       virtual void f4(){
           cout<<"Cunt"<<endl;
       }

};

int main(){
    A* ptr;
    B obj;
    ptr=&obj;
    ptr->f4();
    return 0;
}

另外,為什么下面的代碼會生成 output base而不是 output derived的?

class A{
   public:
       void f4(){
           cout<<"base"<<endl;
       }
};

class B: public A{
    public:
       virtual void f4(){
           cout<<"derived"<<endl;
       }

};

int main(){
    A* ptr;
    B obj;
    ptr=&obj;
    ptr->f4();
    return 0;
}

請幫忙。 我對機制有誤嗎?

在 class A中, function f4也應定義為virtual

class A {
   public:
       virtual void f4(){
           std::cout << "base" << std::endl;
       }
};

在您的情況下,由於非虛擬 inheritance, f4是非虛擬 function。
還有一件事,派生的虛函數應該標記為override ,而virtual不是必需的:

class B : public A {
public:
    void f4() override {
        std::cout << "derived" << std::endl;
    }
};

如果您嘗試將B中的f4標記為override而不首先在A中使其成為virtual ,您將收到編譯錯誤: error: 'virtual void B::f4()' marked 'override', but does not override - 這意味着您將無法A class 指針訪問它。

旁注:閱讀以下帖子: 為什么“使用命名空間標准;” 被認為是不好的做法?

在您的第一個示例中, A沒有名為f4()的方法,因此對ptr->f4()的調用無效。

在您的第二個示例中, A::f4()未標記為virtual ,因此對ptr->f4()的調用不執行虛擬調度,因此調用A::f4()而不是B::f4() .

這兩個問題的解決方案是相同的 - 使f4()A中是虛擬的,並讓B override它,例如:

class A{
   public:
       virtual void f4() {
           cout << "base" << endl;
       }
};

class B: public A{
    public:
       void f4() override {
           cout << "derived" << endl;
       }
};

int main(){
    A* ptr;
    B obj;
    ptr = &obj;
    ptr->f4();
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM