关于类继承的简单问题。。。

sWinZ 2006-10-06 06:41:59
类A中有个方法X,类B中也有个方法X,类B继承于类A,有没有一种方式,当调用类B中的方法X时,自动先调用类A中的X方法,然后再调用类B中的X方法???(类似于虚方法这样的内部解决方案)
...全文
787 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
c8640 2006-10-08
  • 打赏
  • 举报
回复
看了你的贴了,其实我也很菜,很难给你非常满意的看法,但是我还是想表达一下自己的看法,说得不对,请指正:
定义:virtual A::X()
B::X()
//定义A、B类对像
A a
B b
//定义基类指针,
A *p
//用基类指针指向派生类对像。
p=b
//调用
p->X();
/*现在调用的就是A类中的虚函数X().
再在A类X()加入调用B::X() */


c8640 2006-10-08
  • 打赏
  • 举报
回复
纠正,上面我的想法,则错的,我在计算机上面调试过了。
大选 2006-10-08
  • 打赏
  • 举报
回复
帮忙顶下。
DanielWYO 2006-10-07
  • 打赏
  • 举报
回复
SetWindowLongPtr的时候, 类型是LONG_PTR, 非LONG哦.
你仍然转换成LONG自然错的.
cunsh 2006-10-07
  • 打赏
  • 举报
回复
补充下:所有操作是在同一个类中的,所以我感觉跟static没关系
===================

类的非静态成员函数的地址应该是没有办法转换为long型的.
因为有可能是虚函数. 一般指向非静态成员函数的指针不用4字节表示.
还有.你这里是个用来回调的函数吧? 回调函数也不能用非静态成员函数.否则执行的时候要绑到该类型的一个对象上才行
xueminhong 2006-10-07
  • 打赏
  • 举报
回复
使用向上类型转换,能办到的.
dingfengbo 2006-10-07
  • 打赏
  • 举报
回复
把x作为构造方法就行了
sWinZ 2006-10-07
  • 打赏
  • 举报
回复
找你说的把LONG改成LONG_PTR 问题一样 只不过不是转换LONG错误 变成转LONG_PTR错误
sWinZ 2006-10-06
  • 打赏
  • 举报
回复
补充下:所有操作是在同一个类中的,所以我感觉跟static没关系
sWinZ 2006-10-06
  • 打赏
  • 举报
回复
AA::WndProc不是static的

设置成SetWindowLongPtr错误照旧
DanielWYO 2006-10-06
  • 打赏
  • 举报
回复
前一个问题, 现有的做法都是最土的, 在继承的类中要求直接调用父类的函数成员.

DanielWYO 2006-10-06
  • 打赏
  • 举报
回复
前一个问题没有意义的.

后一个问题你改成SetWindowLongPtr就好了.
cunsh 2006-10-06
  • 打赏
  • 举报
回复
AA::WndProc是static嘛
sWinZ 2006-10-06
  • 打赏
  • 举报
回复
都不是我想要的答案 随便问个被的问题吧 明天结帖

SetWindowLong(hWnd, GWL_WNDPROC, (LONG)AA::WndProc);


LRESULT CALLBACK AA::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

出现错误:

错误 1 error C2440: “类型转换”: 无法从“LRESULT (__stdcall AA::* )(HWND,UINT,WPARAM,LPARAM)”转换为“LONG” e:\other\c++2005\example001\example001\aa.cpp 16

我用的是VS2005的开发环境,Win32的项目,在GOOGLE和BAIDU中查了很长时间,未能找到答案,

第一个解决这个问题的送50分
sinall 2006-10-06
  • 打赏
  • 举报
回复
这种方法我知道 但我想知道不用手动调用 有没有自动调用的方法? 比如在类B中没有X这个方法,程序就会自动调用类A中的X方法
——————————————————————————————————————————
呵呵,你虽然知道这种方法,但你template method模式吗?建议你看看。
举个简单例子:
class A
{
public:
virtual void X();
void Func()
{
X();
}
};

class B : public A
{
public:
virtual void X()
{
A::X();
}
};

A *p = new B;
如果B复写了X,那么p->Func()将会调用B::X;否则,仍然调用A::X。
ckt 2006-10-06
  • 打赏
  • 举报
回复
如上,设置虚函数就行了哪
OOPhaisky 2006-10-06
  • 打赏
  • 举报
回复
class A
{
public:
void X();
};

class B : public A
{
public:
void X()
{
A::X();
}
};

B b;
b.X();//先调用A::X(),再调用B::X()
jixingzhong 2006-10-06
  • 打赏
  • 举报
回复
要实现 当调用类B中的方法X时,自动先调用类A中的X方法,然后再调用类B中的X方法,
有很多方法,
一个是把X方法放到构造函数中去,
由于构造的时候是先构造 子对象部分, 那么上一级的 X 将先被调用 ...

或者是 B 中隐藏实现X,
其中先调用父类的 X 方法 ...
jixingzhong 2006-10-06
  • 打赏
  • 举报
回复
虚函数机制,
调用实际类型版本函数,
如果实际类型没有实现, 调用上一级类型实现函数 ...
sWinZ 2006-10-06
  • 打赏
  • 举报
回复
这种方法我知道 但我想知道不用手动调用 有没有自动调用的方法? 比如在类B中没有X这个方法,程序就会自动调用类A中的X方法
加载更多回复(4)

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧