symbian的C++摸索一
看看初哥的我如何一次次的在symbian里绊倒吧。
symbian里的多态及其参数的传递,方法的定义我越是尝试越感到陌生。
我定义了一个类作为准备作为基类
#include <e32std.h>
#include <e32cons.h> // Console
class CVehicle
{
public:
CVehicle();
virtual ~CVehicle();
void Run(CConsoleBase* aConsole);
};
Vehicle.cpp什么也没写,保留着IDE为我加的空的构造和析构函数。编译类,没有报错。好,那就试用用
{
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
{
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方法
class CAutocycle: CVehicle
{
public:
CAutocycle();
virtual ~CAutocycle();
void Jump(CConsoleBase * aConsole);
};
父类的方法只能在子类内部使用。
{
Run(aConsole);//使用父类的Run,不报错。
aConsole->Write(_L("Autocycle is jumping.."));
}
显然,对于多态这种非public的继承是没法用的。看以下代码
CAutocycle cycle;
veh = &cycle;//非public时,编译时报错。
编译报错:
illegal access from 'CAutocycle' to protected/private member 'CVehicle::'
接着的尝试都基于public的继承。我准备让CAutocycle重载Run方法。我想到了virtual,但我先不加上,而是直接在Autocycle.cpp中直接加上run方法
{
aConsole->Write(_L("Autocycle is runing..\n"));
}
编译报错:
#ff0000 identifier 'Run'
那好办Autocycle.h加上void Run(CConsoleBase* aConsole);好,测试我们的多态是否如愿。
{
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重写。

浙公网安备 33010602011771号