导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

关于类继承的问题

crysword 2009-08-05 11:37:43
class a
{
public:
virtual void initParameter(int* myPar);
virtual void freeParameter();
};

我想创建一个窗体,同时继承a和CDialog
class c: public CDialog, public a
{
//****
}

然后使用
c cc;
a* aa = (a*)&cc;
a->initParameter(*);
使用后cc的指针变空,本身的initParameter函数也没有被执行。

是不是不能同时继承CDialog和其它的类?
...全文
167 点赞 收藏 26
写回复
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
crysword 2009-08-17
哎,搞不定了,结贴
回复
快乐鹦鹉 2009-08-05
在使用前&datasave = 0x1a0afa14 datasave hwnd = 0x7c017d40
执行后,&datasave = 0x1a0afa14 datasave hwnd = 0x00000000
==你是指执行哪个之后?还是这段代码执行后?
回复
zhwzgp123 2009-08-05
你的程序应该没有问题的,我用你的代码测试完全正常:
void CTestDlg::OnButton1()
{
f_datasave.Create(IDD_DATASAVE_DIALOG, this);

CDialog* dia = (CDialog*)&f_datasave;
dia->SetWindowPos(&wndBottom, 0, 100, 640, 300, SWP_SHOWWINDOW);
Form_Parent* fp = (Form_Parent*)&f_datasave;
fp->initParameter(NULL);
}
class CTestDlg : public CDialog
{
// Construction
public:
Form_DataSave f_datasave;//----------------注意这里,不能放在上面函数中(否则函数结束后子窗口就销毁了)



DEBUG信息:
------------------------Form_DataSave::initParameter 说明执行是正确的
回复
雪影 2009-08-05
Form_Parent* fp = (Form_Parent*)&datasave; 不能这样直接转换的。

Form_Parent* fp = static_cast<Form_Parent*>(&datasave); 
回复
xttgx 2009-08-05
up
回复
Ghost90 2009-08-05
而且Form_DataSave 中的initParameter也没有被执行
fp->initParameter(*);
执行的是 Form_Parent 中的 initParameter

datasave 的hwnd变了就不对了
datasave 是在哪定义的?是 Form_DataSave f_datasave; ??
回复
crysword 2009-08-05
不好意思,a->initParameter(*); 这是我在问问题的时候写错了
其实是这样的
class Form_Parent
{
public:
Form_Parent();
virtual ~Form_Parent();
public:
virtual void initParameter(int* myPar);
virtual void freeParameter();
};

class Form_DataSave : public CDialog, public Form_Parent
{
//--------
public:
virtual void initParameter(int* myPar);
virtual void freeParameter();
}

使用的时候我想把Form_DataSave作为子窗体嵌入主窗体中,所以Form_DataSave 属性是Child
在主窗体使用的时候
Form_DataSave f_datasave;
f_datasave.Create(IDD_DATASAVE_DIALOG, this);

CDialog* dia = (CDialog*)&datasave;
dia->SetWindowPos(&wndBottom, 0, 100, 640, 300, SWP_SHOWWINDOW);
Form_Parent* fp = (Form_Parent*)&datasave;
fp->initParameter(*);

在使用前&datasave = 0x1a0afa14 datasave hwnd = 0x7c017d40
执行后,&datasave = 0x1a0afa14 datasave hwnd = 0x00000000
而且Form_DataSave 中的initParameter也没有被执行
回复
副组长 2009-08-05
a* aa = (a*)&cc;
这样继承多个类的类型转换是不是能对齐啊?太危险吧。
回复
快乐鹦鹉 2009-08-05
继承多个类自然没有问题的了。
a->initParameter(*); 肯定是错了。
另外,你从CDialog继承,那么一定要注意,必须该类OnCreate之后,或者该类的内部OnInitDialog之后才能操作对话框上的控件
回复
yayafu 2009-08-05
????使用后cc的指针变空?????
cc是对象,它哪来的指针啊
回复
sayhorse 2009-08-05
[Quote=引用 1 楼 zhoujianhei 的回复:]
a->initParameter(*);
应该是aa->initParameter(*); 吧。

除此之外,没什么问题啊。
[/Quote]

支持!!!
回复
shakeyou123 2009-08-05
a->initParameter(*);
楼主这里错了吧,应该是aa吧
回复
zhoujianhei 2009-08-05
a->initParameter(*);
应该是aa->initParameter(*); 吧。

除此之外,没什么问题啊。
回复
lsd123 2009-08-05
.
回复
Ghost90 2009-08-05
ReBuild All

你的代码应该没问题,全部重新编译就好了,我以前遇到过类似的情况
回复
WooSir 2009-08-05
既然已经从是从CDialog和Form_Parent 派生,
就没必要再强制转化回CDialog和Form_Parent 了

直接用
datasave.SetWindowPos(&wndBottom, 0, 100, 640, 300, SWP_SHOWWINDOW);
datasave.initParameter
回复
雪影 2009-08-05
[Quote=引用 10 楼 tttyd 的回复:]
Form_Parent* fp = (Form_Parent*)&datasave; 不能这样直接转换的。

C/C++ codeForm_Parent* fp= static_cast<Form_Parent*>(&datasave);
[/Quote]

up
回复
crysword 2009-08-05
实际上我是想用比较少的代码实现这种功能
7-8个窗体,在程序启动的时候创建,在需要的时候动态创建它们上面的控件,在不需要的时候将这些创建好的控件释放。
类似窗体间的切换显示的那种效果。
回复
Ghost90 2009-08-05
class Form_DataSave : public CDialog, public Form_Parent

Form_DataSave 继承2个类 一下用CDialog的函数 一下用 Form_Parent 的函数

是不是有问题呀??

to 版猪??????
回复
Ghost90 2009-08-05
这句的问题吧

CDialog* dia = (CDialog*)&datasave;
dia->SetWindowPos(&wndBottom, 0, 100, 640, 300, SWP_SHOWWINDOW);
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……