symbian的C++摸索一

看看初哥的我如何一次次的在symbian里绊倒吧。

symbian里的多态及其参数的传递,方法的定义我越是尝试越感到陌生。

我定义了一个类作为准备作为基类

#include <e32base.h>
#include 
<e32std.h>
#include 
<e32cons.h>            // Console
class CVehicle
{
public:
    CVehicle();
    
virtual ~CVehicle();
    
void Run(CConsoleBase* aConsole);
};

Vehicle.cpp什么也没写,保留着IDE为我加的空的构造和析构函数。编译类,没有报错。好,那就试用用

LOCAL_C void MainL()
{    
    console
->Write(_L("Hello, world!\n"));
    CVehicle veh;
    veh.Run(console);
//加上这一行编译才报错误。
    console->Getch();//让程序停下来。
}

在没有加veh.Run(console)时编译通过,加上后报
Undefined symbol: 'void CVehicle::Run(class CConsoleBase *) (?Run@CVehicle@@QAEXPAVCConsoleBase@@@Z)' 

好了问题当然是我,为此我在Vehicle.cpp里加了Run方法的实现,结果当然没错了。继续,我又加了一个CAutocycle继承自CVehicle,不过我刻意只在后面加上这样来定义“class CAutocycle: CVehicle”,CVehicle前少了public。好,来试试Autocycle

LOCAL_C void MainL()
{    
    console
->Write(_L("Hello, world!\n"));    
    CAutocycle cycle;    
    
//cycle.Run(console);//没有使用public时,编译时报错。
    cycle.Jump(console);
    console
->Getch();
}

结果,编译时报错

illegal access from 'CAutocycle' to protected/private member 'CVehicle::Run(CConsoleBase *)' 

这的意思比较明显,说run方法无法访问,这个public的意思应该比较显示了,应是说父类的东西是否公布。当然公布了,不然继承的意义何在,多态的意义何在。所以我们极少见到继承后面没有加上public的。当然,如果我们非要不公布呢?因为父类的方法我们只想在CAutocycle类的内部使用,那就不要public。我在子类CAutocycle增加了jump方法

#include "Vehicle.h"

class CAutocycle: CVehicle
{
public:
    CAutocycle();
    
virtual ~CAutocycle();
    
void Jump(CConsoleBase * aConsole);
};

父类的方法只能在子类内部使用。

void CAutocycle::Jump(CConsoleBase * aConsole)
{
    Run(aConsole);
//使用父类的Run,不报错。
    aConsole->Write(_L("Autocycle is jumping.."));
}

显然,对于多态这种非public的继承是没法用的。看以下代码

CVehicle* veh;
CAutocycle cycle;
veh 
= &cycle;//非public时,编译时报错。

编译报错:

illegal access from 'CAutocycle' to protected/private member 'CVehicle::' 

接着的尝试都基于public的继承。我准备让CAutocycle重载Run方法。我想到了virtual,但我先不加上,而是直接在Autocycle.cpp中直接加上run方法

void CAutocycle::Run(CConsoleBase * aConsole)
{
    aConsole
->Write(_L("Autocycle is runing..\n"));
}

 

编译报错:
#ff0000 identifier 'Run' 

那好办Autocycle.h加上void Run(CConsoleBase* aConsole);好,测试我们的多态是否如愿。

LOCAL_C void MainL()
{    
    console
->Write(_L("Hello, world!\n"));
    CVehicle
* veh;
    CAutocycle cycle;
    veh 
= &cycle;//非public时,编译时报错。
    veh->Run(console);
    console
->Getch();
}

屏幕输出“Vehicle is runing...”,并不是我们期待的“Autocycle is runing..”。好了,到Vehicle.h,为Run方法加上virtual

virtual void Run(CConsoleBase* aConsole);

编译,重新运行,输出了我们期待的“Autocycle is runing..”。加上了virtual会不会就不用在Autocycle.h再次定义Run?我试了,一样要加上。这有点...

好了,kevin明白了基本的public、virtual重写。


posted @ 2009-12-08 09:02  生命体验之kevin-Y  阅读(362)  评论(0)    收藏  举报