CP VC6//虛擬函數+動態連結的另類實作
¶CP VC6//虛擬函數+動態連結的另類實作
原文連結: https://darkblack01.blogspot.com/2012/09/cp-vc6_13.html
移植時的最後更新日期: 2013-12-13T09:23:02.817+08:00
原本實作了出了問題,後來朋友用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 Afun1() = 0;
virtual Afun2() = 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
發表於
tags:
{ 抱怨VC6 }