看一看,這做法,我印象中做過呀!??
貼到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
沒有留言:
張貼留言
(什麼是留言欄訊息?)