簡體   English   中英

通過引用基類作為參數的函數傳遞派生類

[英]Passing derived class by reference to function taking base class as parameter

請考慮以下代碼:

class A {
public:
    virtual ~A() { }

    virtual void print() const {
        std::cout << "In A" << std::endl;
    }
};

class B : public A {
public:
    B() { }
    virtual ~B() { }

    virtual void print() const {
        std::cout << "In B" << std::endl;
    }
};

void doSomething(A* a) {
    a->print();
}

void doSomething(const A a) {
    a.print();
}

int main()
{
    A* a = new B();
    doSomething(a);
    doSomething(B());
    return 0;
}

為什么這個輸出:

In B
In A

但當你改變doSomething to doSomething(const A& a)它會輸出:

In B
In B

這稱為切片

當通過值傳遞A ,通過僅復制調用者對象的A部分來制作本地副本。 由於它既有靜態和動態類型的A ,也就是所選擇的print覆蓋。

通過引用傳遞,該函數獲取對動態類型B的調用者對象的引用,以便選擇覆蓋。

使用抽象基類可以防止這樣的混亂行為 - 它們不能直接實例化,因此不能通過值傳遞。

暫無
暫無

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

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