看看這段代碼:
#include <iostream>
class A{
public:
int x;
virtual void f(){std::cout << "A f\n";}
};
class B: public A
{
public:
int y;
void f() {std::cout << "B f\n";}
};
void fun( A & arg)
{
std::cout << "fun A called" << std::endl;
arg.f();
// arg.y = 222; - this gives error, compiler's work?
arg.x = 2223333;
}
void fun(B & arg){
std::cout << "fun B called" << std::endl;
arg.f();
}
int main()
{
B b;
b.y = 12;
b.x = 32;
fun(static_cast<A&>(b));
std::cout << b.x << " " << b.y << std::endl;
return 0;
}
當我將 cast b 參考到 A& 時究竟會發生什么?我猜對型別 A 'arg' 的參考是在函式 'fun()' 中創建的,現在它只是編譯器區分型別的作業?這意味著沒有創建實際物件并且沒有發生切片并且它仍然是記憶體中的相同物件,但是編譯器會將其視為型別 A?(意思是在函式呼叫后我可以安全地使用 b 作為型別 B?)
我認為這是真的,因為實體的 vptr 沒有改變(型別 A 的 arg 稱為 B 的虛函式覆寫),但我不完全確定在參考轉換期間幕后發生了什么。
另外,如果我分配static_cast<A&>(b)給一個型別為 A 的新物件,我假設那是在構造一個型別為 A 的新物件并進行切片的時候?
uj5u.com熱心網友回復:
是的,你似乎得到了這個。:-)
AB也是 an A(通過繼承),因此它可以系結到A&或B&。沒有其他事情發生,它只是對現有物件的參考。
如果您將一個B物件分配給一個A物件,例如A a = b;,則會發生切片,它只會復制 的繼承A部分b。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/376520.html
上一篇:如何為所有物件呼叫一次函式?
