簡體   English   中英

C ++中3個類的多態性

[英]Polymorphism with 3 classes in C++

以下代碼打印1 2,但我希望它打印1 1。

#include <iostream>

using namespace std;

class A {
public:
    virtual void f() { cout << "0" << endl; }
}; 

class B : public A{
public:
    void f() { cout << "1" << endl; }
};

class C : public B{
public:
    void f() { cout << "2" << endl; }
};

int main() {
    A *pa = new B();
    B *pb = new C();
    pa->f();
    pb->f();
}

根據我的理解,pa-> f()執行B的f()函數,因為A是虛擬的,但是當B的f()不是虛擬時,為什么pb-> f()執行C的f()函數。

另外,如果我從A類中刪除'virtual',它會打印0 1,這是有道理的,因為A和B執行它們自己的f()函數,因為它們不是虛擬的。 如果pb-> f()沒有受到影響,怎么會改變,因為只有A會發生變化?

但是當B的f()不是虛擬的時候,為什么pb-> f()執行C的f()函數。

因為pb的動態類型是CC::f確實是虛擬的。 當你申報時

virtual void f();

在基類中,層次結構中派生類的每個其他void f()也是虛擬的,如§10.3/ 2所示:

如果虛擬成員函數vf在類Base和Derived類中聲明, 直接或間接從Base派生,則具有相同名稱的成員函數vf,parameter-type-list(8.3.5),cv-qualification和聲明了Base :: vf的ref-限定符(或不存在),然后Derived :: vf也是虛擬的(無論是否如此聲明)並且它覆蓋了112 Base :: vf。

(強調我的)

事實上:

class A {
public:
    virtual void f() { cout << "0" << endl; }
}; 

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

class C : public B{
public:
    virtual void f() { cout << "2" << endl; }
};

相當於你的代碼。 碰巧的是,C ++標准允許在這些情況下省略virtual

這是因為在子類中編寫虛擬關鍵字不是必需的,它只是提高了可讀性。

暫無
暫無

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

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