![](/img/trans.png)
[英]Is it possible to pass derived classes by reference to a function taking base class as a parameter
[英]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.