注册 登录
编程论坛 C++教室

类的相关问题

BlueMouse 发布于 2008-09-07 13:56, 1059 次点击
class GUIBASE
{
    public:
        HWND    hWnd;

        virtual void onLoad(void){};
        virtual void onUnload(void){};
        virtual void onClick(void){};
};

class cWindow:public GUIBASE
{
    public:
         void onLoad(void){};
    void onUnload(void){};
    void onClick(void){};
};

class MyWindow:public cWindow
{
    public:
        void onLoad(void){MessageBox(null,"被成功调用了!", "测试", MB_OK);};
};

-----------------------------
我的问题是! 当创建一个 MyWindow 的对象时 在cWindow中如何调用 MyWindow 的 onLoad 方法?
难点在于MyWindow与cWindow下分离开的!我的意思是说在cWindow操作时完全不知道有 MyWindow这么一个子类!也就是操作任何从cWindow派生的子类的方法!有办法吗?
17 回复
#2
sunkaidong2008-09-07 14:45
虚函数
#3
守鹤2008-09-07 14:51
子类可以调用父类的方法,但父类却不能调用子类的方法
#4
BlueMouse2008-09-07 14:53
如果真的元法做到!但只能说明C++的面向对象特性还不是很强大!
#5
BlueMouse2008-09-07 15:08
我认为是可以做到的!但是我没有试成功!
为什么呢!从原理上来看
~~~~~~~~~~~~~~~~~~~~~~
因为 GUIBASE 和 cWindow 都是不需要实现的!也就是说他们没有对象的!
而你生成的对象都是派生类 MyWindow的对象, 所以我认为按原理说应该是
父类的对象不能调用派生类MyWindow的对象的成员才合理!
而通过声明指向基类GUIBASE的指针通过虚特性,应该可以调用派生类的对象的虚函数实现才对的吧! 应为生成的对象是派生类MyWindow的对象呀!不过我就是没有搞成功! 问题在于指针声明成那一个类的它就只能调用那个杰的对应的虚函数的实现体!而我不可能把指针声明成的派生类的类型。因为我要的是派生类可以重新实现虚函数,也可以不实现!当不实现时就用 cWindow 的对应虚函数实现体!我被困很久了!
#6
BlueMouse2008-09-07 15:12
我的目的是要用面向对象的思想来包装一个自己的 windows 程序的基本框架!
也就是像我做要一个库! GUIBASE, cWindow 是我自定义和实现的!

而 MyWindow 对库来说是不可知的!因为用库编程人员从cWindow派生出去后给的类名对“库”来说是不可知的!
#7
shaoyuan2008-09-07 22:37
不行,如果不知道有子类的存在又怎么能调用它。
#8
冰冷剑2008-09-08 12:29
是可以的!定义一个函数,传递的参数是父的引用.
例:void show_result(GUIBASE& gb)
{
    gb.onLoad();
}

MyWindow mw;
show_result(mw);
#9
BlueMouse2008-09-08 13:09
没有问题·!试过了!是我的程序那里出了问题!但不是类和虚函数的问题
#10
中学者2008-09-08 17:12
LZ问题解决没? 是要创建对象的时候调用?  随便问下LZ是贵州大学的?
#11
中学者2008-09-08 17:14
回复 8# 冰冷剑 的帖子
你这个不是在创建对象时调用....不符合LZ要求-,-
#12
中学者2008-09-08 17:21
难道是我理解错了LZ的意思?
#13
BlueMouse2008-09-08 17:26
问题不是出在类的存取权限上,也不是虚函数的问题!因为下面的代码中MyWindow中的onLoad能被调用了!证明我的类代码没有错!也证明了C++的对向对象特性没有问题!
其实我上面说的就是多态特性的问题。下面的代码没有问题,所以是我的程序的别的地方出了问题!


这里特别这样说明,和贴上以下代码!以免新手被我先前的提问误导!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <windows.h>

class GUIBASE
{
public:
    virtual void onLoad(void){}
};

GUIBASE        *ptr;

class cWindow : public GUIBASE
{
public:
    cWindow(void)
    {
        ptr = this;
    };
    virtual void onLoad(void)
    {
    };
};

class MyWindow : public cWindow
{
public:
    void onLoad(void)
    {
        MessageBox(NULL, "被成功调用了!", "测试", MB_OK);
    }
};



int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    MyWindow    MyWindowObj;
    ptr->onLoad();
    return 0;
}

----------------------------
回 版主(中学者):
       在下读书时....现在很后悔呀..
       我的意思是说我没有上过大学,连高中都没有上过!呵呵!见笑了!
       所以在下不是贵州大学的!版主是在找贵州大学的同学还是朋友吧!
       很抱歉,我不是!

[[it] 本帖最后由 BlueMouse 于 2008-9-8 17:32 编辑 [/it]]
#14
中学者2008-09-08 17:32
看来是我理解错LZ的意思了....还以为是要在创建时调用...
#15
中学者2008-09-08 17:36
LZ的方法学习了...呵呵
#16
BlueMouse2008-09-08 17:40
版主谦虚了!这是多态特性,面向对象编程很实用呀!呵呵! 我是想自己包装一个WINDOWS程序的基本框架! 不过遇到了N多问题!以后还得多多请教版主才是!
#17
中学者2008-09-08 17:43
LZ的代码似乎还没达到目的...
#18
中学者2008-09-08 17:44
晕....我又搞错了....确实是调用了....
1