锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 渚嬪瓙涓嬌鐢ㄥ埌澶氭佺殑浠g爜浠ラ粦浣撴爣鍑轟簡錛屽畠浠竴涓緢鏄庢樉鐨勭壒寰佸氨鏄氳繃涓涓熀綾葷殑鎸囬拡錛堟垨鑰呭紩鐢級鏉ヨ皟鐢ㄤ笉鍚屽瓙綾葷殑鏂規硶銆?br>
閭d箞錛岀幇鍦ㄧ殑闂鏄紝榪欎釜鍔熻兘鏄庢牱瀹炵幇鐨勫憿錛熸垜浠彲浠ュ厛鏉ュぇ姒傜寽嫻嬩竴涓嬶細瀵逛簬涓鑸殑鏂規硶璋冪敤錛屽埌浜嗘眹緙栦唬鐮佽繖涓灞傛鐨勬椂鍊欙紝涓鑸兘鏄嬌鐢?Call funcaddr
榪欐牱鐨勬寚浠よ繘琛岃皟鐢紝鍏朵腑funcaddr鏄璋冪敤鍑芥暟鐨勫湴鍧銆傛寜鐞嗘潵璇達紝褰撴垜浣跨敤鎸囬拡pShape鏉ヨ皟鐢―raw鐨勬椂鍊欙紝緙栬瘧鍣ㄥ簲璇ュ皢Shape::Draw鐨勫湴鍧璧嬬粰funcaddr錛岀劧鍚嶤all
鎸囦護灝卞彲浠ョ洿鎺ヨ皟鐢⊿hape::Draw浜嗭紝榪欏氨璺熺敤pShape鏉ヨ皟鐢⊿hape::Erase涓鏍楓備絾鏄紝榪愯緇撴灉鍗村憡璇夋垜浠紝緙栬瘧鍣ㄨ祴緇檉uncaddr鐨勫煎嵈鏄疌ircle::Drawde鐨勫箋傝繖灝辮鏄庯紝緙栬瘧鍣ㄥ湪瀵瑰緟Draw鏂規硶鍜孍rase鏂規硶鏃朵嬌鐢ㄤ簡鍙岄噸鏍囧噯銆傞偅涔堢┒绔熸槸璋佹湁榪欎箞澶х殑娉曞姏錛屼嬌緙栬瘧鍣ㄨ繖涓搧闈㈡棤縐佺殑鍒ゅ畼閮借鍙︾溂鐩哥湅鍛紵virtual錛侊紒 鍦ㄤ笂闈㈣繖涓緥瀛愪腑錛屼竴涓狣og瀵硅薄鍦ㄥ唴瀛樹腑鐨勫竷灞濡備笅鎵紺猴細
Dog Vptr1 Cute::i Vptr2 Pet::j Dog::z
濂戒簡錛屾棦鐒剁紪璇戝櫒甯垜浠嚜鍔ㄥ畬鎴愪簡涓嶅悓鐖剁被鐨勫湴鍧杞崲錛屾垜浠皟鐢ㄨ櫄鍑芥暟鐨勮繃紼嬩篃灝辮窡鍗曠戶鎵跨粺涓璧鋒潵浜嗭細閫氳繃鍏蜂綋瀵硅薄錛屾壘鍒皏ptr錛堥氬父鎸囬拡鐨勮搗濮嬩綅緗紝鍥犳Cute鎵懼埌鐨勬槸vptr1錛岃孭et鎵懼埌鐨勬槸vptr2錛夛紝閫氳繃vptr錛屾垜浠壘鍒癡Table錛岀劧鍚庢牴鎹紪璇戞椂寰楀埌鐨刅Table绱㈠紩鍙鳳紝鎴戜滑鍙栧緱鐩稿簲鐨勫嚱鏁板湴鍧錛屾帴鐫灝卞彲浠ラ┈涓婅皟鐢ㄤ簡銆?br>
絎簩涓氨鏄瀽鏋勫嚱鏁幫紝浣跨敤澶氭佺殑鏃跺欙紝鎴戜滑緇忓父浣跨敤鍩虹被鐨勬寚閽堟潵寮曠敤媧劇敓綾葷殑瀵硅薄錛屽鏋滄槸鍔ㄦ佸垱寤虹殑錛屽璞′嬌鐢ㄥ畬鍚庯紝鎴戜滑浣跨敤delete鏉ラ噴鏀懼璞°備絾鏄紝濡傛灉鎴戜滑涓嶆敞鎰忕殑璇濓紝浼氭湁鎰忔兂涓嶅埌鐨勬儏鍐靛彂鐢熴?/p>
鎵浠ワ紝濡傛灉涓涓被璁捐鐢ㄦ潵琚戶鎵跨殑璇濓紝閭d箞瀹冪殑鏋愭瀯鍑芥暟搴旇琚0鏄庝負virtual鐨勩?/p>
{
protected:
int m_x; // X coordinate
int m_y; // Y
coordinate
public:
// Pure virtual function for drawing
virtual
void Draw() = 0;
// A regular virtual function
virtual void
MoveTo(int newX, int newY);
// Regular method, not overridable.
void Erase();
// Constructor for Shape
Shape(int x, int
y);
// Virtual destructor for Shape
virtual ~Shape();
};
class Circle : public Shape
{
private:
int m_radius; // Radius of the circle
public:
// Override to draw a
circle
virtual void Draw();
// Constructor for Circle
Circle(int x, int y, int radius);
// Destructor for Circle
virtual ~Circle();
};
Shape::Shape(int x, int y)
{
m_x =
x;
m_y = y;
}
// Shape destructor
implementation
Shape::~Shape()
{
//...
}
Circle::Circle(int x, int y, int radius) :
Shape (x, y)
{
m_radius = radius;
}
// Circle destructor
implementation
Circle::~Circle()
{
//...
}
// Circle override
of the pure virtual Draw method.
void Circle::Draw()
{
glib_draw_circle(m_x, m_y, m_radius);
}
main()
{
// Define a circle with a center at (50,100) and a radius of 25
Shape
*pShape = new Circle(50, 100, 25);
// Define a circle with a center at
(5,5) and a radius of 2
Circle aCircle(5,5, 2);
// Various
operations on a Circle via a Shape pointer
//Polymorphism
pShape->Draw();
pShape->MoveTo(100, 100);
pShape->Erase();
delete
pShape;
// Invoking the Draw method directly
aCircle.Draw();
}
Clever錛侊紒姝f槸virtual榪欎釜鍏抽敭瀛椾竴鎵嬪婕斾簡榪欎竴鍑?#8220;涔懼潳澶ф尓縐?#8221;鐨勫ソ鎴忋傝閬撹繖閲岋紝鎴戜滑鍏堣鏄庣‘涓や釜姒傚康錛氶潤鎬佺粦瀹氬拰鍔ㄦ佺粦瀹氥?br>
1銆侀潤鎬佺粦瀹氾紙static
bingding錛夛紝涔熷彨鏃╂湡緇戝畾錛岀畝鍗曟潵璇村氨鏄紪璇戝櫒鍦ㄧ紪璇戞湡闂村氨鏄庣‘鐭ラ亾鎵瑕佽皟鐢ㄧ殑鏂規硶錛屽茍灝嗚鏂規硶鐨勫湴鍧璧嬬粰浜咰all鎸囦護鐨刦uncaddr銆傚洜姝わ紝榪愯鏈熼棿鐩存帴浣跨敤Call鎸囦護灝卞彲璋冪敤鍒扮浉搴旂殑鏂規硶銆?br> 2銆佸姩鎬佺粦瀹氾紙dynamic
binding錛夛紝涔熷彨鏅氭湡緇戝畾錛屼笌闈欐佺粦瀹氫笉鍚岋紝鍦ㄧ紪璇戞湡闂達紝緙栬瘧鍣ㄥ茍涓嶈兘鏄庣‘鐭ラ亾絀剁珶瑕佽皟鐢ㄧ殑鏄摢涓涓柟娉曪紝鑰岃繖錛岃鐭ラ亾榪愯鏈熼棿浣跨敤鐨勫叿浣撴槸鍝釜瀵硅薄鎵嶈兘鍐沖畾銆?br>
濂戒簡錛屾湁浜嗚繖涓や釜姒傚康浠ュ悗錛屾垜浠氨鍙互璇達紝virtual鐨勪綔鐢ㄥ氨鏄憡璇夌紪璇戝櫒錛氭垜瑕佽繘琛屽姩鎬佺粦瀹氾紒緙栬瘧鍣ㄥ綋鐒朵細灝婇噸浣犵殑鎰忚錛岃屼笖涓轟簡瀹屾垚浣犺繖涓姹傦紝緙栬瘧鍣ㄨ繕瑕佸仛寰堝鐨勪簨鎯咃細緙栬瘧鍣ㄨ嚜鍔ㄥ湪澹版槑浜唙irtual鏂規硶鐨勭被涓彃鍏ヤ竴涓寚閽坴ptr鍜屼竴涓暟鎹粨鏋刅Table錛坴ptr鐢ㄤ互鎸囧悜VTable錛沄Table鏄竴涓寚閽堟暟緇勶紝閲岄潰瀛樻斁鐫鍑芥暟鐨勫湴鍧錛夛紝騫朵繚璇佷簩鑰呴伒瀹堜笅闈㈢殑瑙勫垯錛?br>
1銆乂Table涓彧鑳藉瓨鏀懼0鏄庝負virtual鐨勬柟娉曪紝鍏跺畠鏂規硶涓嶈兘瀛樻斁鍦ㄩ噷闈€傚湪涓婇潰鐨勪緥瀛愪腑錛孲hape鐨刅Table涓氨鍙湁Draw錛孧oveTo鍜寏Shape銆傛柟娉旹rase鐨勫湴鍧騫朵笉鑳藉瓨鏀懼湪VTable涓傛澶栵紝濡傛灉鏂規硶鏄函铏氬嚱鏁幫紝濡?
Draw錛岄偅涔堝悓鏍瘋鍦╒Table涓繚鐣欑浉搴旂殑浣嶇疆錛屼絾鏄敱浜庣函铏氬嚱鏁版病鏈夊嚱鏁頒綋錛屽洜姝よ浣嶇疆涓茍涓嶅瓨鏀綝raw鐨勫湴鍧錛岃屾槸鍙互閫夋嫨瀛樻斁涓涓嚭閿欏鐞嗙殑鍑芥暟鐨勫湴鍧錛屽綋璇ヤ綅緗鎰忓璋冪敤鏃訛紝鍙互鐢ㄥ嚭閿欏嚱鏁拌繘琛岀浉搴旂殑澶勭悊銆?br>
2銆佹淳鐢熺被鐨刅Talbe涓褰曠殑浠庡熀綾諱腑緇ф壙涓嬫潵鐨勮櫄鍑芥暟鍦板潃鐨勭儲寮曞彿蹇呴』璺熻铏氬嚱鏁板湪鍩虹被VTable涓殑绱㈠紩鍙蜂繚鎸佷竴鑷淬傚鍦ㄤ笂渚嬩腑錛屽鏋滃湪Shape鐨刅Talbe涓紝Draw涓?
1 鍙鳳紝 MoveTo 2 鍙鳳紝~Shape涓?3 鍙鳳紝閭d箞錛屼笉綆¤繖浜涙柟娉曞湪Circle涓槸鎸夌収浠涔堥『搴忓畾涔夌殑錛孋ircle鐨刅Table涓兘蹇呴』淇濊瘉Draw涓?
1 鍙鳳紝MoveTo涓?2鍙楓傝嚦浜?3鍙鳳紝榪欓噷鏄瘇Circle銆備負浠涔堜笉鏄瘇Shape鍟婏紵鍢垮樋錛屽繕鍟︼紝鏋愭瀯鍑芥暟涓嶄細緇ф壙鐨勩?br>
3銆乿ptr鏄敱緙栬瘧鍣ㄨ嚜鍔ㄦ彃鍏ョ敓鎴愮殑錛屽洜姝ょ紪璇戝櫒蹇呴』璐熻矗涓哄叾榪涜鍒濆鍖栥傚垵濮嬪寲鐨勬椂闂撮夊湪瀵硅薄鍒涘緩鏃訛紝鑰屽湴鐐瑰氨鍦ㄦ瀯閫犲嚱鏁頒腑銆傚洜姝わ紝緙栬瘧鍣ㄥ繀欏諱繚璇佹瘡涓被鑷沖皯鏈変竴涓瀯閫犲嚱鏁幫紝鑻ユ病鏈夛紝鑷姩涓哄叾鐢熸垚涓涓粯璁ゆ瀯閫犲嚱鏁般?br>
4銆乿ptr閫氬父鏀懼湪瀵硅薄鐨勮搗濮嬪錛屼篃灝辨槸Addr(obj) == Addr(obj.vptr)銆?br>
浣犵湅錛屽ぉ涓嬫灉鐒舵病鏈夊厤璐圭殑鍗堥錛屼負浜嗗疄鐜板姩鎬佺粦瀹氾紝緙栬瘧鍣ㄨ涓烘垜浠粯榛樺共浜嗚繖涔堝鐨勮剰璇濈瘡媧匯傚鏋滀綘鎯充綋楠屼竴涓嬬紪璇戝櫒鐨勮緵鍔籌紝閭d箞鍙互灝濊瘯鐢–璇█妯℃嫙涓涓嬩笂闈㈢殑琛屼負錛屻?銆戜腑灝辨湁榪欎箞涓涓緥瀛愩傚ソ浜嗭紝鐜板湪涓囦簨鍏峰錛屽彧嬈犱笢椋庝簡銆傜紪璇戯紝榪炴帴錛岃澆鍏ワ紝GO錛佸綋紼嬪簭鎵ц鍒?
pShape->Draw()鐨勬椂鍊欙紝涓婇潰鐨勮鏂戒篃寮濮嬭搗浣滅敤浜嗐傘?br>
鍓嶉潰宸茬粡鎻愬埌錛屾櫄鏈熺粦瀹氭椂涔嬫墍浠ヤ笉鑳界‘瀹氳皟鐢ㄥ摢涓嚱鏁幫紝鏄洜涓哄叿浣撶殑瀵硅薄涓嶇‘瀹氥傚ソ浜嗭紝褰撹繍琛屽埌pShape->Draw()鏃訛紝瀵硅薄鍑烘潵浜嗭紝瀹冪敱pShape鎸囬拡鏍囧嚭銆傛垜浠壘鍒拌繖涓璞″悗錛屽氨鍙互鎵懼埌瀹冮噷闈㈢殑vptr錛堝湪瀵硅薄鐨勮搗濮嬪錛夛紝鏈変簡vptr鍚庯紝鎴戜滑灝辨壘鍒頒簡VTable錛岃皟鐢ㄧ殑鍑芥暟灝卞湪鐪煎墠浜嗐傘傜瓑絳夛紝VTable涓柟娉曢偅涔堝錛屾垜絀剁珶浣跨敤鍝釜鍛紵涓嶇敤鐫鎬ワ紝緙栬瘧鍣ㄦ棭宸蹭負鎴戜滑鍋氬ソ浜嗚褰曪細緙栬瘧鍣ㄥ湪鍒涘緩VTable鏃訛紝宸茬粡涓烘瘡涓獀irtual鍑芥暟瀹夋帓濂戒簡搴ф錛屽茍涓旀妸榪欎釜绱㈠紩鍙瘋褰曚簡涓嬫潵銆傚洜姝わ紝褰撶紪璇戝櫒瑙f瀽鍒?strong>pShape->Draw()鐨勬椂鍊欙紝瀹冨凡緇忔倓鎮勭殑灝嗗嚱鏁扮殑鍚嶅瓧鐢ㄧ儲寮曞彿鏉ヤ唬鏇夸簡銆傝繖鏃跺欙紝鎴戜滑閫氳繃榪欎釜绱㈠紩鍙峰氨鍙互鍦╒Table涓緱鍒頒竴涓嚱鏁板湴鍧錛孋all
it錛?br>
鍦ㄨ繖閲岋紝鎴戜滑灝變綋浼氬埌涓轟粈涔堜細鏈夌浜屾潯瑙勫畾浜嗭紝閫氬父錛屾垜浠兘鏄敤鍩虹被鐨勬寚閽堟潵寮曠敤媧劇敓綾葷殑瀵硅薄錛屼絾鏄笉綆″叿浣撳璞℃槸鍝釜媧劇敓綾葷殑錛屾垜浠兘鍙互浣跨敤鐩稿悓鐨勭儲寮曞彿鏉ュ彇寰楀搴旂殑鍑芥暟瀹炵幇銆?br>
鐜板疄涓湁涓涓緥瀛愬叾瀹炶窡榪欎釜铔儚鐨勶細鎶ヨ鐢佃瘽鏈?10錛?19錛?20錛圴Table涓笉鍚岀殑鏂規硶錛夈備笉鍚屽湴鏂圭殑浜烘嫧鎵撲笉鍚岀殑鍙風爜鎵浜х敓鐨勭粨鏋滈兘鏄笉涓鏍風殑銆傝濡傦紝鍦ㄤ笁鐜鐨勪竴涓漢錛堝叿浣撳璞★級璺熶竴鐜唴鐨勪竴涓漢錛堝彟澶栦竴涓叿浣撳璞★級鎵?19錛屾渶鍚庤皟鐢ㄧ殑娑堥槻闃熻偗瀹氭槸涓嶄竴鏍風殑錛岃繖灝辨槸澶氭佷簡銆傝繖鏄庝箞瀹炵幇鐨勫憿錛屾瘡涓漢閮界煡閬撲竴涓姤璀︿腑蹇冿紙VTable錛岄噷闈㈡湁涓変釜鏂規硶
110錛?19錛?20錛夈傚鏋滀笁鐜鐨勪竴涓漢闇瑕佺伀璀︽姠闄╋紙涓涓叿浣撳璞★級鏃訛紝瀹冨氨鎷ㄦ墦119錛屼絾鏄粬鑲畾涓嶇煡閬撴渶鍚庢槸鍝竴涓秷闃查槦浼氬嚭鐜扮殑銆傝繖寰楁湁鎶ヨ涓績鏉ュ喅瀹氾紝鎶ヨ涓績閫氳繃榪欎釜鍏蜂綋瀵硅薄錛堜緥瀛愪腑灝辨槸鍏蜂綋浣嶇疆浜嗭級浠ュ強浠栬鎷ㄦ墦鐨勭數璇濆彿鐮侊紙鍙互鐞嗚В鎴愮儲寮曞彿錛夛紝鎶ヨ涓績鍙互紜畾搴旇璋冨害鍝竴涓秷闃查槦榪涜鎶㈤櫓錛堜笉鍚岀殑鍔ㄤ綔錛夈?br>
榪欐牱錛岄氳繃vptr鍜孷Table鐨勫府鍔╋紝鎴戜滑灝卞疄鐜頒簡C++鐨勫姩鎬佺粦瀹氥傚綋鐒訛紝榪欎粎浠呮槸鍗曠戶鎵挎椂鐨勬儏鍐碉紝澶氶噸緇ф壙鐨勫鐞嗚鐩稿澶嶆潅涓鐐癸紝涓嬮潰綆瑕佽涓涓嬫渶綆鍗曠殑澶氶噸緇ф壙鐨勬儏鍐碉紝鑷充簬铏氱戶鎵跨殑鎯呭喌錛屾湁鍏磋叮鐨勬湅鍙嬪彲浠ョ湅鐪?
Lippman鐨勩奍nside the C++ Object
Model銆嬶紝榪欓噷鏆傛椂灝變笉灞曞紑浜嗐傦紙涓昏鏄嚜宸辮繕娌℃悶娓呮錛屽喌涓旂幇鍦ㄥ閲嶇戶鎵塊兘涓嶆庝箞浣跨敤浜嗭紝铏氱戶鎵垮簲鐢ㄧ殑鏈轟細灝辨洿灝戜簡錛?br>
棣栧厛錛屾垜瑕佸厛璇翠竴涓嬪閲嶇戶鎵夸笅瀵硅薄鐨勫唴瀛樺竷灞錛屼篃灝辨槸璇磋瀵硅薄鏄浣曞瓨鏀炬湰韜殑鏁版嵁鐨勩?/p>
{
public:
int i;
virtual void cute(){ cout<<"Cute
cute"<<endl; }
};
{
public:
int j;
virtual void say(){ cout<<"Pet
say"<<endl; }
};
{
public:
int z;
void cute(){
cout<<"Dog cute"<<endl; }
void say(){ cout<<"Dog
say"<<endl; }
};
涔熷氨鏄錛屽湪Dog瀵硅薄涓紝浼氬瓨鍦ㄤ袱涓獀ptr,姣忎竴涓窡鎵緇ф壙鐨勭埗綾葷浉瀵瑰簲銆傚鏋滄垜浠鎯沖疄鐜板鎬侊紝灝卞繀欏誨湪瀵硅薄涓噯紜湴鎵懼埌鐩稿簲鐨剉ptr錛屼互璋冪敤涓嶅悓鐨勬柟娉曘備絾鏄紝濡傛灉鏍規嵁鍗曠戶鎵挎椂鐨勯昏緫錛屼篃灝辨槸vptr鏀懼湪鎸囬拡鎸囧悜浣嶇疆鐨勮搗濮嬪錛岄偅涔堬紝瑕佸湪澶氶噸緇ф壙鎯呭喌涓嬪疄鐜幫紝鎴戜滑蹇呴』淇濊瘉鍦ㄥ皢涓涓淳鐢熺被鐨勬寚閽堥殣寮忔垨鑰呮樉寮忓湴杞崲鎴愪竴涓埗綾葷殑鎸囬拡鏃訛紝寰楀埌鐨勭粨鏋滄寚鍚戠浉搴旀淳鐢熺被鏁版嵁鍦―og瀵硅薄涓殑璧峰浣嶇疆銆傚垢濂斤紝榪欏伐浣滅紪璇戝櫒宸茬粡甯垜浠畬鎴愪簡銆備笂闈㈢殑渚嬪瓙涓紝濡傛灉Dog鍚戜笂杞崲鎴怭et鐨勮瘽錛岀紪璇戝櫒浼氳嚜鍔ㄨ綆桺et鏁版嵁鍦―og瀵硅薄涓殑鍋忕Щ閲忥紝璇ュ亸縐婚噺鍔犱笂Dog瀵硅薄鐨勮搗濮嬩綅緗紝灝辨槸Pet鏁版嵁鐨勫疄闄呭湴鍧浜嗐?/p>
{
Dog* d = new Dog();
cout<<"Dog object addr :
"<<d<<endl;
Cute* c = d;
cout<<"Cute type addr :
"<<c<<endl;
Pet* p = d;
cout<<"Pet type addr :
"<<p<<endl;
delete d;
}
Dog
object addr : 0x3d24b0
Cute type addr : 0x3d24b0
Pet type addr :
0x3d24b8 // 姝eソ鎸囧悜Dog瀵硅薄鐨剉ptr2澶勶紝涔熷氨鏄疨et鐨勬暟鎹?br>
鍦ㄨ繖閲岋紝欏轟究涔熸彁涓涓嬩袱涓壒孌婄殑鏂規硶鍦ㄥ鎬佷腑鐨勭壒鍒箣澶勫惂錛氱涓涓槸鏋勯犲嚱鏁幫紝鍦ㄦ瀯閫犲嚱鏁頒腑璋冪敤铏氬嚱鏁版槸涓嶄細鏈夊鎬佽涓虹殑錛屼緥瀛愬涓嬶細
{
public:
Pet(){ sayHello(); }
void say(){ sayHello();
}
virtual void sayHello()
{
cout<<"Pet
sayHello"<<endl;
}
};
{
public:
Dog(){};
void sayHello()
{
cout<<"Dog sayHello"<<endl;
}
};
{
Pet* p = new Dog();
p->sayHello();
delete
p;
}
Pet
sayHello //鐩存帴璋冪敤鐨勬槸Pet鐨剆ayHello()
Dog sayHello //澶氭?br>
{
public:
~Pet(){ cout<<"Pet destructor"<<endl;
}
//virtual ~Pet(){ cout<<"Pet virtual destructor"<<endl;
}
};
{
public:
~Dog(){ cout<<"Dog
destructor"<<endl;};
//virtual ~Dog(){ cout<<"Dog virtual
destructor"<<endl; }
};
{
Pet* p = new Dog();
delete p;
}
濡傛灉鎴戜滑灝嗘瀽鏋勫嚱鏁版敼鎴恦irtual浠ュ悗錛岀粨鏋滃涓?br>Dog virtual destructor
Pet virtual
destructor // That's OK!
鍏堟潵鐪嬩竴孌典唬鐮侊紝鍦ㄧ戶鎵跨殑綾籄dvance涔嬩腑錛屾湁寰堝灞炴у瓧孌碉紝鎴?a style="font-size: 1em;" id="vad_0" class="vLink9999" onmouseover="if(typeof(showTitle)!='undefined'){this.title='';window.clearTimeout(hideTO);showTitle(event, this, 0,'');}" title="" onmouseout="if(typeof(showTitle)!='undefined'){mouseIsOverLayer = false; mouseoverwhileload =" false;="" hideto=" window.settimeout('checkifmouseoverlayer()',500);}" onclick="" target="_blank">甯屾湜灝嗗叾娓呮垚0鎴朜ULL錛屼簬鏄湪鏋勯犲嚱鏁頒腑鎴戦氳繃memset灝嗗綋鍓嶇被鐨勬墍鏈夊睘鎬х疆0銆?
class Base{
public:
virtual void kickoff() = 0;
};
class Advance:public Base{
public:
Advance(){
memset(this, 0, sizeof(Advance));
}
void kickoff(){
count++;
//... do something else;
}
private:
int attr1, attr2;
char* label;
int count;
//...
other attributes, they should be initiated to 0 or NULL at beginning.
};
int _tmain(int argc, _TCHAR* argv[])
{
Base* ptr = new Advance();
ptr->kickoff();
return 0;
}
榪欐牱鐪嬩技鑳芥甯歌繍琛岋紝浣嗚繍琛岀▼搴忔椂錛屼綘浼氬彂鐜扮被浼間簬涓嬮潰鐨勯敊璇細
TestVirtual.exe 涓殑 0x00415390 澶勬湭澶勭悊鐨勫紓甯? 0xC0000005: 璇誨彇浣嶇疆 0x00000000
鏃跺彂鐢熻闂啿紿?
鍚屾椂鏂偣鍋滅暀鍦╬tr->kickoff()澶勶紝浠庨敊璇彁紺烘垜浠彲浠ュ緱鐭ユ棤娉曡皟鐢╧ickoff鏂規硶錛岃繖涓柟娉曠殑鎸囬拡娌℃湁琚紜垵濮嬪寲錛屼絾涓轟粈涔堝憿錛?
鎸囧嚭闂涔嬪墠錛屽厛鐪嬬湅榪欐鏂囩尞涓婄殑鍏充簬铏氬嚱鏁版満鍒剁殑璇存槑錛?
鍑芥暟璧栦互鐢熷瓨鐨勫簳灞傛満鍒訛細vptr +
vtable銆傝櫄鍑芥暟鐨勮繍琛屾椂瀹炵幇閲囩敤浜哣PTR/VTBL鐨勫艦寮忥紝榪欓」鎶鏈?/a>鐨勫熀紜錛?
鈶犵紪璇戝櫒鍦ㄥ悗鍙頒負姣忎釜鍖呭惈铏氬嚱鏁扮殑綾諱駭鐢熶竴涓潤鎬佸嚱鏁版寚閽堟暟緇勶紙铏氬嚱鏁拌〃錛夛紝鍦ㄨ繖涓被鎴栬呭畠鐨勫熀綾諱腑瀹氫箟鐨勬瘡涓涓櫄鍑芥暟閮芥湁涓涓浉搴旂殑鍑芥暟鎸囬拡銆?
鈶℃瘡涓寘鍚櫄鍑芥暟鐨勭被鐨勬瘡涓涓疄渚嬪寘鍚竴涓笉鍙鐨勬暟鎹垚鍛榲ptr錛堣櫄鍑芥暟鎸囬拡錛夛紝榪欎釜鎸囬拡琚瀯閫犲嚱鏁拌嚜鍔ㄥ垵濮嬪寲錛屾寚鍚戠被鐨剉tbl錛堣櫄鍑芥暟琛級
鈶㈠綋瀹㈡埛璋冪敤铏氬嚱鏁扮殑鏃跺欙紝緙栬瘧鍣ㄤ駭鐢熶唬鐮佸弽鎸囧悜鍒皏ptr錛岀儲寮曞埌vtbl涓紝鐒跺悗鍦ㄦ寚瀹氱殑浣嶇疆涓婃壘鍒板嚱鏁版寚閽堬紝騫跺彂鍑鴻皟鐢ㄣ?
榪欓噷鐨勯棶棰橈紝灝卞嚭鍦?
memset(this, 0, sizeof(Advance));
涓婇潰錛岃櫄鍑芥暟鎸囬拡搴旇鍦ㄨ繘鍏ユ瀯閫犲嚱鏁拌祴鍊間綋涔嬪墠鑷姩鍒濆鍖栫殑錛岃宮emset鍗村張灝嗗凡緇忓垵濮嬪寲濂界殑鎸囬拡娓?浜嗭紝榪欏氨鏄負浠涔堜細浜х敓涓婇潰鐨勮闂浂鍧鐨勯敊璇傚皢涓婇潰鐨刴emset璇彞鍘婚櫎紼嬪簭灝卞彲浠ユ甯歌繍琛屼簡銆?
鎵浠ワ紝浠庝笂闈㈢殑闂涓紝鎴戜滑鍙互鐪嬪嚭鍦ㄦ瀯閫犲嚱鏁頒綋鍐呰皟鐢╩emset灝嗘暣涓璞℃竻0鏄緢鏈夐闄╃殑錛屽綋娌℃湁铏氬嚱鏁扮殑鏃跺欎笂闈㈢▼搴忓彲浠ユ甯歌繍琛岋紙鍙互璇曠潃灝咮ase綾葷殑綰櫄鍑芥暟澹版槑鏀規垚闈炶櫄鍑芥暟鍐嶈繍琛岀▼搴忥級銆傚垵濮嬪寲綾葷殑灞炴у璞℃椂錛屾瘮杈冪ǔ濡ョ殑鍔炴硶榪樻槸鎵嬪姩閫愪釜榪涜鍒濅嬌鍖?
shadow map 浠ュ墠鏃╁氨鐮旂┒榪囷紝涓嶈繃涓嬈′笉灝忓績鎶婁互鍓嶅仛鐨勪笢瑗塊兘寮勪涪浜嗭紝浠婂ぉ閲嶆柊鍋氫簡涓涓嬶紝
鍔犲埌浜嗙郴緇熼噷錛岀粰澶у鐪嬩笅鏁堟灉錛氾級
shadow map綆楁硶鍘熺悊寰堢畝鍗?鍏堢畝鍗曚粙緇嶄笅綆楁硶緇欐柊浜猴細
1.浠ュ厜婧愭墍鍦ㄤ綅緗負瑙傚療鐐規覆鏌撳満鏅紙鍙互鍙覆鏌撻渶瑕佷駭鐢熼槾褰辯殑鐗╀綋錛夊皢娓叉煋鍚庣殑娣卞害鍊間繚瀛樻繁搴﹀浘錛堜竴寮犱簨鍏堝噯澶囧ソ鐨勭汗鐞嗭級銆?br>鍦ㄦ姝ラ渶瑕佹敞鎰忕殑鏄?姝ゆ娓叉煋鐢ㄥ埌鐨勬ā鍨嬭瑙嗘姇褰辯煩闃碉紙浠ュ悗綆縐癿vp錛夐渶瑕佷繚瀛樹竴涓嬶紝涓嬩竴姝ヨ鐢ㄥ埌銆?br>2.姝e父娓叉煋鍦烘櫙錛屽皢欏剁偣鍧愭爣涔樹互姝ラ涓鏃跺欑殑mvp錛屽皢鍧愭爣鍙樻崲鍒頒互鍏夋簮涓鴻瀵熺偣鐨勫潗鏍囩郴閲岋紝姣旇緝z鍊煎拰浠庢繁搴﹀浘涓鍑烘潵鐨?br>鍊煎緱澶у皬鍒ゆ柇閬尅錛屾湁閬尅鐨勮瘽灝嗚緭鍑洪鑹插噺寮辨垨鑰呮崲鎴愬埆鐨勯殢絎斾綘浜嗐傚叾涓湁涓湴鏂歸渶瑕佹敞鎰忥紝濡備綍浠庢繁搴﹀浘綰圭悊涓鏁版嵁錛?br>榪欎釜鎴戞槸榪欎箞瑙e喅鐨勶細float2 suv = ((spos.xy/spos.z))//鍏朵腑spos鏄彉鎹㈠埌鍏夋簮鍧愭爣緋諱笅鐨勯《鐐規暟鎹紝寰楀埌鐨剆uv緇忚繃澶勭悊鍚庡彲浠?br>褰撳仛娣卞害鍥劇殑綰圭悊鍧愭爣鍊鹼紝璇誨彇鏂規硶涓篺loat4 shadow = tex2D(t11,(suv+1.0)*0.5)錛屽叾涓敤鍒頒竴涓?1錛?銆戝埌銆?錛?銆戠殑鍙樻崲銆?br>鍓╀笅鐨勫氨鏄瘮杈冧簡 錛?
float sz = 1 - spos.z/(gDepthSize)錛?/灝嗘繁搴﹀煎彉鎹㈠埌銆?錛?銆戝尯闂達紝gDepthSize鏄幏寰楁繁搴︾汗鐞嗘椂娓叉煋鍦烘櫙鐨勬渶娣卞?
//澧炲姞闃村獎
if((sz < shadow.x))//sz鏄氨鏄?br> {
color = color*(1 - shadow);
color.w = 1.0;
//color = float4(sz,sz,sz,1);
}
//----------------------------------------------------------------------------------------------------------------------------
鍏充簬shadow map 綆楁硶鐨勭己鐐?璺熷ぇ瀹惰璁轟竴涓?
姘歌繙鐨勫洶鎵皊hadow map鐨勫け鐪熼棶棰橈紝褰撳厜婧愮収灝勫満鏅◢澶х殑鏃跺欏け鐪熺幇璞″氨浼氬緢涓ラ噸錛屾湁浜涙敼榪涚畻娉曪紝浣嗛兘瑙夊緱娌繪爣涓嶆不鏈?br>濡傛灉璇存垜鏁翠釜鍦烘櫙鏈夊緢澶氬埌澶勮窇鐨勪漢錛岄偅浠栦滑鐨勯槾褰辨晥鏋滆鎬庢牱鍋氬憿錛燂紵錛?br>
鎰熻shadow map鐢ㄥ湪鐢熸垚褰撳墠瑙掕壊鐨勯槾褰辨尯濂斤紝濡傛灉鏄ぇ鑼冨洿鐨勪笉澶ч傚悎銆傚緢澶氶潤鎬佺殑鐗╀綋鍙互鍏堟妸闃村獎浜嬪厛璁$畻濂斤紝鐢ㄧ殑鏃跺?br>鐩存帴璇誨彇錛屾病鏈夊繀瑕佹瘡甯ч兘閲嶆柊璁$畻銆?br>
//----------------------------------------------------------------------------------------------------------------------------
shadow map 鏈澶х殑濂藉鏄彲浠ュ鐞嗛忔槑綰圭悊鐨勯槾褰憋紝浠ヤ負鎴戠殑鍦烘櫙鐨勬爲鏄敤閫忔槑綰圭悊鐢諱笂鍘葷殑錛屽鏋滃緱鍒扮殑闃村獎鏄釜鐭?br>褰㈤偅灝卞緢鎬簡錛屽垢濂絪hadow map 娌℃湁榪欎釜闂錛侊紒錛?br>
浠婂ぉ鑰冭檻紼嬪簭鐨勪紭鍖栭棶棰橈紝紿佺劧鎯沖埌璇寸幇鍦╲etex shader宸茬粡鍙互璁塊棶綰圭悊璧勬簮浜嗭紝鍙互鎶婅闂珮搴﹀浘鐨勬搷浣滆漿縐?br>鍒皏etex shader涓幓鍋氳綆楋紝GPU璁塊棶綰圭悊鐨勯熷害瑕佹瘮CPU璁塊棶鍐呭瓨蹇浜嗗惂錛堟垜鏄繖涔堣涓虹殑錛夈備笉榪囬亣瑙佷竴涓棶棰樸?br>鐢╰ex2D璁塊棶鍑烘潵鐨勫兼殑錛屼笉鏄垜瑕佺殑楂樺害綰圭悊鍊鹼紝鍚庢潵鍙戠幇濡傛灉fragment shader閲岄潰璁塊棶浜嗗埆鐨勭汗鐞嗕細褰卞搷鍒皏etex閲?br>闈㈢殑錛屼笂緗慻oogle浜嗕竴涓嬶紝濂藉浜洪兘璇村緱鐢?tex2DLod鎵嶈錛岃瘯浜嗕笅涓鐐瑰ソ杞殑榪硅薄閮芥病鏈夛紝鍙堟湁浜鴻綰圭悊寰楁槸float鐨勶紝鍙傜収
鐫鏀逛簡涓嬶紝榪樻槸涓嶈銆傦紙寰堝鏃跺欏湪緗戜笂鏌ュ埌鐨勯兘涓嶅ソ鐢紝褰撶劧涔熸湁濂界敤鐨勶紝鏈夌偣搴熻瘽錛屽搱鍝堬級
鍚庢潵紿佺劧鍙戠幇鎴戠殑sampler閮芥病鏈夎窡瀵勫瓨鍣ㄧ粦瀹氾紝緇戝畾浜嗕互鍚庡氨濂戒簡錛屽緢濂囨紝闅鵑亾璇村彧璋冪敤cgGLSetTextureParameter
騫朵笉鑳藉疄鐜扮汗鐞嗙殑緇戝畾錛?nbsp; 鐜板湪鎴戞妸鎵鏈塻ampler閮借窡涓涓瘎瀛樺櫒緇戝畾鍚庡氨涓鍒囨甯鎬簡銆?br>
灝卞儚榪欐牱錛?br>//--------------------------------------------------------------------------------
sampler2D t10 :TEXUNIT0;//鍦伴潰楂樺害鍥? 鍏朵粬鐨剆ampler涔熼渶瑕佺粦瀹氬埌瀵勫瓨鍣ㄦ墠浼氬ソ鐢?br>
OutPut xS_v(float4 ipos:POSITION,
float2 tex:TEXCOORD0,
float3 normal:NORMAL)
{
OutPut OUT; //out鏄叧閿瓧
ipos.y =tex2D(t10,tex).z*256;
//---------------------------------------------------------------------------------
cg璇█榪愯鍑烘潵鐨勭粨鏋滅粡甯告殑錛屾湁涓嬈℃垜鏁呮剰鍐欓敊浜嗕竴鍙ヨ瘽錛岀粨鏋滅紪璇戜篃鑳介氳繃錛屽彧鏄樉紺哄嚭鏉ョ殑瀹屽叏涓?br>鏄垜鎯寵鐨勶紝鏈夋病鏈夐珮浜烘寚鐐逛竴涓嬶紝澶氳阿錛侊紒
涓嶈繃鎶婅闂珮搴﹀浘鏀瑰埌鐢℅PU璁塊棶綰圭悊鍚庯紝鏁堟灉榪樻槸寰堟槑鏄劇殑錛岄熷害鎻愬崌浜嗗樊涓嶅涓鍊嶃?br>
1.瀹炵幇浜嗗垁瀹㈢殑鍔ㄤ綔鎺у埗銆傦紙md2鏂囦歡錛孏PU瀹炵幇甯у姩鐢伙級銆?br>2.璇曢獙浜嗘按闈㈡晥鏋滐紙鏈夊弽灝勭汗鐞嗘槧灝勶紝姘撮潰娉曠嚎璐村浘璁$畻鍏夌収鍜屾壈鍔級銆?br>3.璇曢獙浜哹illboard鏁堟灉銆?br>4.淇敼紼嬪簭涓殑涓浜沚ug銆?br>
鏈変袱涓釜闂錛?br>1.OpenGL濡備綍鎻愰珮鏁堢巼錛屾榪庢寚鏁欙紒
2.flt鏂囦歡濡備綍綆鍖栵紝鏈夊ソ鐢ㄧ殑宸ュ叿涔堬紝鎴戠殑閮芥槸浠?ds瀵艱繃鏉ョ殑錛岄潰鏁板お澶氫簡錛屼笉澶ч傜敤銆?br>
鍙戝嚑寮犲鍥撅紝璐葷瑧澶ф柟錛?br>
鎰熻姘撮潰鍙嶅皠鍔犱簡鏍戠殑鍊掑獎鍙嶈屽彉寰楁殑錛侊紒
鍐嶆潵鍑犲紶鍓嶅嚑澶╂埅寰楀浘
榪欐槸鎴戠殑灝忚姳鍥紝澶ф爲鐨勭汗鐞嗙儌閫忎簡銆?br>
灝忔渤嫻佹按 鍝楀暒鍟?#8230;…
鍘繪帀鍦板艦鐨勬晥鏋滐紝鎰熻榪樿洰婕備寒鐨勶紝鍛靛懙
澶у鏈変粈涔堢湅娉曞敖閲忕暀璦錛屾偍鐨勫叧娉ㄥ氨鏄鎴戞渶澶х殑甯姪錛侊紒
Parallax Mapping
瀵瑰簲鐨勭綉鏍煎浘
瓚佺潃浜哄皯鍙戜袱寮犵瓑鐫鎸ㄧ爾澶寸殑鏁堟灉鍥俱?br>
鐪嬩簡涓澶╃殑璧勬枡錛岃瘉瀹炰簡鍘熸潵鐨勬兂娉曟槸瀵圭殑銆?br>normal map 鏄?bump map 鐨勬敼榪涳紝涓昏鏄疓PU鍙紪紼嬩負鍏跺垱閫犱簡鏉′歡銆?br>parallax map 鏄?normal map 鐨勬敼榪涚増鏈紝鐩稿綋浜庢槸瀵筺ormal map 鐨勪慨姝o紝娌′粈涔堝績鎰忋?br>
Displacement Mapping璨屼技鎸虹墰錛屾槑澶╀粩緇嗙爺絀朵笅 錛?錛?br>
鍏堟潵寮犺皟鏁翠簡鍙傛暟鐨剅oam緗戞牸鍥劇墖錛屾妸闈㈢墖鏁扮害鏉熷湪1w錛岃繖涓媟oam鐨勬晥鏋滃氨鏄庢樉浜嗗惂錛?br>鍙戠幇鍦板娍濡傛灉涓嶆槸鐗瑰埆騫沖潶鐨勮瘽錛屽緢闅炬壘鍒頒竴涓弧鎰忕殑鍙傛暟錛屾棦鑳藉噺灝戦潰鐗囨暟錛屽張鑳藉彇寰楀緢濂界殑鏄劇ず鏁堟灉銆?br>濡傛灉鏈夊ぇ鐗囧ぇ鐗囩殑騫沖湴錛岄偅灝辯畝鍗曚簡銆?br>
榪欐槸浣跨敤cg璇█瀹炵幇鐨?texture blend 浣跨敤鍥涘紶綰圭悊鍔犱竴涓粏鑺傜汗鐞嗘販鍚堣屾垚錛?br>澧炲姞浜嗗儚绱犵駭鐨?Phone 鍏夌収妯″瀷銆傚厜鐓х殑棰滆壊鏈夌偣鎬殑銆?br>
闈㈢墖鏁拌窡甯ф暟姘歌繙鐨勮浜哄緢鐭涚浘銆傝繖鏍蜂互鍚庣獊鍙樺氨寰堜笉鏄庢樉浜嗭紝鑲夌溂鍑犱箮鍙戠幇涓嶄簡錛屼笉榪囨劅瑙夋湁閫鍖栨垚鏅氱殑lod鐨勮秼鍔褲?br>褰撶劧錛岃繙澶勭殑緗戞牸榪樻槸浼氭湁璺沖姩鐜拌薄錛屼笉榪囬偅宸茬粡寰堣繙浜嗭紝涓鑸笉浼氭湁浜烘敞鎰忓埌鍙戠敓浜嗕粈涔堛?br>鍙槸榪欐牱澶уぇ澧炲姞浜嗙綉鏍兼暟閲忥紝搴旂敤涓嬭鏅綋鍓櫎鏁堟灉浼氭瘮榪欎釜濂藉緢澶氬惂錛?br>
榪欎釜鏄垜瀹炵幇鍑烘潵鐨?roam terrain 鍦板艦
闂鏄紝褰撴垜鍦ㄥ湴褰笂婕父鏃訛紝緗戞牸蹇呯劧浼氬彂鐢熷彉鍖栥備笉鍚屽眰嬈$殑緗戞牸涔嬮棿璺寵穬鐨勫緢鍘夊錛岃浜鴻寰楀湴褰㈠緢涓嶇湡瀹烇紝
鏈夋病鏈変漢鏈夊ソ鐨勫姙娉曡兘瑙e喅錛?br>
榪欏紶鏄垰寮濮嬫椂娌″姞杞戒笂澶栭儴鏂囦歡鏃剁殑
榪欏紶鏄垎鐐告晥鏋滃浘
榪欏紶鏄潃鐏晥鏋?br>
琚寮硅拷鍑?br>
鏈鍚庢潵寮犲鑹茬編鏅?br>
璇氱浖鐗涗漢鎸囩偣涓嶈凍錛?br>