2012年9月13日 星期四

CP VC6//虛擬函數+動態連結的另類實作

原本實作了出了問題,後來朋友用g++過了,程式碼也給我了。
看一看,這做法,我印象中做過呀!??
貼到VC6,結果ERROR C2555

心想:這就是傳說中的「微軟不符合標準C++嗎?」
Google了一下,微軟自己還在文件說明中指出,這是產品的問題,更好笑的是,文件的Title寫:「修正: C2555 共的傳回型別具有虛擬函式」。

跟本沒有修正,只說「.Net就修正了」
(意思是你愛用VC6是你家的事,不換.Net活該?= =)

不過,我後來硬幹了一個做法,似乎可行!(似乎啦^^")
#include <iostream>

using namespace std;

class A
{
public:
virtual A* fun1() = 0;
virtual A* fun2() = 0;
};

class B : public A
{
public:
A* fun1() { cout << "B::fun1()" <<endl; return dynamic_cast<A*>(this);}
A* fun2() { cout << "B::fun2()" <<endl; return dynamic_cast<A*>(this);}
};

class C : public A
{
public:
A* fun1() { cout << "C::fun1()" <<endl; return dynamic_cast<A*>(this);}
A* fun2() { cout << "C::fun2()" <<endl; return dynamic_cast<A*>(this);}
};

int main()
{
B b1;
C c1;

A* a = &b1;
a->fun1()->fun2();

a = &c1;
a->fun1()->fun2();
}
程式結果:

B::fun1()
B::fun2()
C::fun1()
C::fun2()
Press any key to continue


但是,和別人討論完,發現....
下面這樣做也行。

#include <iostream>

using namespace std;

class A
{
public:
virtual A*fun1() = 0;
virtual A*fun2() = 0;
};

class B : public A
{
public:
A* fun1() { cout << "B::fun1()" <<endl; return this; }
A* fun2() { cout << "B::fun2()" <<endl; return this; }
};

class C : public A
{
public:
A* fun1() { cout << "C::fun1()" <<endl; return this; }
A* fun2() { cout << "C::fun2()" <<endl; return this; }
};

int main()
{
B b1;
C c1;

A* a = &b1;
a->fun1()->fun2();

a = &c1;
a->fun1()->fun2();
}

程式結果:

B::fun1()
B::fun2()
C::fun1()
C::fun2()
Press any key to continue


沒有留言:

張貼留言