调用基类成员变量的成员变量...

xychzh 2011-05-28 09:37:11

class CBase
{
public:
CBase() { m_p = new CBase; }
~CBase() {}

protected:
CBase* m_p;
};

class CTest : public CBase
{
public:
CTest() {}
~CTest() {}

void Test()
{
CBase* p = m_p->m_p; // 关键点
}
};

上面"关键点"编译会包错,是因为this类型与m_p类型不同导致的么???
如果强制转换可以么?
一般都这样做是吧?
...全文
195 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

class CBase
{
public:
CBase() {}
~CBase() {}

protected:
CBase* m_p;
int m_a;
};

class CTest : public CBase
{
public:
CTest() {}
~CTest() {}

void Test()
{
int a = m_p->m_a;
}
};

不可以,你只是声明了指针,而没有对其进行定义,所以在你的派生类里面调用这个指针所指对象的成员会出错
,但是如果你对该指针分配了内存,又容易引起循环,所以无论如何,你这段代码都有问题

楼主别钻牛角尖了...
kyotrue 2011-05-28
  • 打赏
  • 举报
回复
把m_p强制转换成CTest*是可以的
xychzh 2011-05-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 q191201771 的回复:]
就你8楼所写
void Test()
{
int a = m_p->m_a;
}
要想在Test中访问基类的m_p是可以的
访问基类的m_a也是可以的
但问题出在m_p->m_a;
这相当于在基类外部调用基类的protected数据成员
CBase t;
t.m_a;
[/Quote]

那是否可以强制类型转换?(是否幽雅或者说是否合适)
如:CTest* pt = (CTest*)m_p;
int a = pt->m_a;
就想叫yoko 2011-05-28
  • 打赏
  • 举报
回复
就你8楼所写
void Test()
{
int a = m_p->m_a;
}
要想在Test中访问基类的m_p是可以的
访问基类的m_a也是可以的
但问题出在m_p->m_a;
这相当于在基类外部调用基类的protected数据成员
CBase t;
t.m_a;
kyotrue 2011-05-28
  • 打赏
  • 举报
回复
所有类对其他类成员的访问,都遵照是否是public的原则,而不论有没有继承关系。

所谓的继承能够访问,那也是继承下来了就是所谓的自己,相当于对自己成员的访问。
kyotrue 2011-05-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xychzh 的回复:]
引用 3 楼 kyotrue 的回复:
你这样赋值会造成无限递归,不可能编译过的吧。。。

no
[/Quote]

额,这个好像不会引起编译错误。

是这样的,你的m_p事CBase类型的,对于CTest来说,m_p是什么类型都没有区别,只要不是和自己相同的类,就不能访问其保护成员。

继承只是把基类的成员变成了自己的而已,可以访问自身的在基类定义的成员,但不代表就拥有对基类对象的访问权了。
xychzh 2011-05-28
  • 打赏
  • 举报
回复
一个笔误,使得大家把目光都转移到笔误上去了,我真正想问的问题没人回答了 - -
我是想问,强转合不合适。
xychzh 2011-05-28
  • 打赏
  • 举报
回复
参考这个代码吧, 我是想问调用基类成员变量的非public成员变量或函数

class CBase
{
public:
CBase() {}
~CBase() {}

protected:
CBase* m_p;
int m_a;
};

class CTest : public CBase
{
public:
CTest() {}
~CTest() {}

void Test()
{
int a = m_p->m_a;
}
};
KID_coder 2011-05-28
  • 打赏
  • 举报
回复
CBase* p = m_p->m_p;
m_p->m_p 第二个m_p已经是另一个实例化的对象里面的m_p,protected属性,不能访问

例外你的构造函数里面会无限递归
xychzh 2011-05-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 namelij 的回复:]
class CBase
{
public:
CBase() { m_p = new CBase; }
~CBase() {}

protected:
CBase* m_p;
};

这样做本身错误的, 在你的构造函数里面new CBase,new的时候又调用构造函数,这样会无限递归,一般不建议这种用法
[/Quote]

哦,谢谢提醒,我这是临时写的用来说明我那个问题的,我写错了,其实可以把行new给抹掉,
  • 打赏
  • 举报
回复
class CBase
{
public:
CBase() { m_p = new CBase; }
~CBase() {}

protected:
CBase* m_p;
};

这样做本身错误的, 在你的构造函数里面new CBase,new的时候又调用构造函数,这样会无限递归,一般不建议这种用法
xychzh 2011-05-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kyotrue 的回复:]
你这样赋值会造成无限递归,不可能编译过的吧。。。
[/Quote]
no
kyotrue 2011-05-28
  • 打赏
  • 举报
回复
你这样赋值会造成无限递归,不可能编译过的吧。。。
xychzh 2011-05-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dizuo 的回复:]
CBase() { m_p = this; }
[/Quote]

理解错了吧?
我是想调用基类一个以基类类型的成员变量的成员变量。
比如窗口基类CWnd,有个父类指针CWnd* pParent, 我想在派生类中调用pParent的成员变量或成员函数
ryfdizuo 2011-05-28
  • 打赏
  • 举报
回复
CBase() { m_p = this; }

64,646

社区成员

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

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