除了在函式呼叫時編譯器可以實現自動轉換外,在進行指標或者引用賦值時也可以自動轉換。和函式呼叫一樣,這兩種情況都不需要顯式的強制轉換。
wind w;
instrument* ip = &w; // upcast
instrument& ir = w; // upcast
在upcast的時候會失去型別資訊,如下編譯器只能將ip作為instrument的指標來呼叫
wind w;
instrument* ip = &w;
ip->play(middlec);
此時呼叫的是基類的
instrument::play( )
而非本意wind::play( ).,這種問題可以通過物件導向的程式設計技術的第三個里程碑多型
polymorphism
來解決,在
c++中是通過虛函式來實現的。
採用多型技術是值傳遞和位址傳遞有很大的區別,因為位址大小總是一樣的;傳遞派生類的位址和基類的位址是一樣的,因為派生類中包含了基類。值傳遞時,派生物件將剝離只剩下基類部分。
//: c15:objectslicing.cpp
#include
#include
using namespace std;
class pet
virtual string name() const
virtual string description() const
}; class dog : public pet
string description() const
}; void describe(pet p)
int main() ///:~
this is alfred
this is fluffy
兩個原因:
首先,當呼叫describe時,只有
pet大小的東西在棧上分配釋放,因此多餘的部分將被剝離;
其次,因為是值傳遞,編譯器知道具體的資料型別,將呼叫
pet的拷貝建構函式,其將
vptr
初始化為
pet的
vtable
,然後將dog的基類部分拷貝至p中,因此p將變成完完全全的pet物件。
指標引用和引用指標的區別
c 在傳參的過程中,指標 和指標引用 是有區別的。雖然,我們往往可以通過傳指標然後通過間址訪問來修改指標所指向物件的值,同樣,通過引用也可以直接修改物件的值。但是,當傳指標的時候有乙個問題,就是,我們雖然可以通過指標來修改指標所指向物件的值,但是我們沒有不能直接修改指標的內容 也就是指標變數存放的位...
指標,和指標的引用
先貼出 void testreference fun1 person p void testreference fun2 person p void testreference fun3 person p 函式fun1傳入乙個指標,在函式內對p進行賦值,fun2傳入乙個指標,修改iage,函式fun...
指標的指標和指標的引用
1,使用指標的指標和指標的引用的原因 當我們把乙個指標做為引數傳乙個方法時,其實是把指標的複本傳遞給了方法,也可以說傳遞指標是指標的值傳遞。如果我們在方法內部修改指標會出現問題,在方法裡做修改只是修改的指標的copy而不是指標本身,原來的指標還保留著原來的值。我們用下邊的 說明一下問題 int m ...