C++的基类如何访问其派生类的成员变量?
例如定义了一个类A,内部有静态变量x(假设初始化后值为1),函数foo需要访问变量x类B继承于类A,所以类B继承了静态变量x(假设初始化后值为2)现在的问题是,当B调用函...
例如定义了一个类A,内部有静态变量x(假设初始化后值为1),函数foo需要访问变量x
类B继承于类A,所以类B继承了静态变量x(假设初始化后值为2)
现在的问题是,当B调用函数foo时,foo函数访问的变量x的值是1,而不是想要的2
问怎样做才能让基类A中的foo函数访问派生类B中的x? 展开
类B继承于类A,所以类B继承了静态变量x(假设初始化后值为2)
现在的问题是,当B调用函数foo时,foo函数访问的变量x的值是1,而不是想要的2
问怎样做才能让基类A中的foo函数访问派生类B中的x? 展开
9个回答
展开全部
基类根本就不能访问派生类的成员,只有基类指针在虚拟继承链上即多态的情况下才可以访问派生类对象的成员。
你是在B的静态构造函数中将x初始化为2,那么请问你声明一个A的实例变量时,有什么地方调用过了派生类B的静态构造函数了吗?没有吧,所以x的值当然会是1,而不是2.
如果你声明一个B类的实例对象变量时,就会调用B类的静态构造函数,但此时也只是B类就是才会访问出结果2,跟A类没有任何关系。当然如果当fool为虚拟继承时,将B类变量的地址转换成A类的指针时,此时A类的指针就能访问出结果2了。
你是在B的静态构造函数中将x初始化为2,那么请问你声明一个A的实例变量时,有什么地方调用过了派生类B的静态构造函数了吗?没有吧,所以x的值当然会是1,而不是2.
如果你声明一个B类的实例对象变量时,就会调用B类的静态构造函数,但此时也只是B类就是才会访问出结果2,跟A类没有任何关系。当然如果当fool为虚拟继承时,将B类变量的地址转换成A类的指针时,此时A类的指针就能访问出结果2了。
追问
我是想做一个类似于MFC消息映射的一个东西
《深入浅出MFC》的第九章中解释了消息映射其实是通过结构体来实现的,这个结构体是一个静态成员变量。
试想,假设CDlgA派生于CDialog,CDlgA中定义了消息映射WM_PAINT,WM_CLOSE。那么父类CDialog是怎么知道CDlgA类中的WM_PAINT和WM_CLOSE呢?
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
问题1:静态变量可以通过继承到子类里,但是你不可能通过子类对X进行第二次初始化,绝对报错
问题2:你可以在子类里去修改这个静态变量,但是在修改这个值之后,即使你去调基类的foo函数,x还是你在子类里已经修改了的值,因为子类和基类的x其实是同一个,他们是同一块内存。
问题3:在基类里没法访问派生类的X。你可以通过多态的特性,在子类父类里写一个虚函数来设置x的值,然后通过使用A的指针去调用B类里的方法。但是对静态变量而言没有什么意义,因为他们是同一个东西,在哪修改都一样。
问题2:你可以在子类里去修改这个静态变量,但是在修改这个值之后,即使你去调基类的foo函数,x还是你在子类里已经修改了的值,因为子类和基类的x其实是同一个,他们是同一块内存。
问题3:在基类里没法访问派生类的X。你可以通过多态的特性,在子类父类里写一个虚函数来设置x的值,然后通过使用A的指针去调用B类里的方法。但是对静态变量而言没有什么意义,因为他们是同一个东西,在哪修改都一样。
追问
关于问题1和问题2,不知道你是不是没有弄明白我的意思,贴一段示例代码吧
class A
{
public:
static int x;
int foo()
{
return x;
}
};
int A::x = 1;
class B :public A
{
public:
static int x;
};
int B::x = 2;
int main(int argc, char* argv[])
{
B b;
b.foo();
return 0;
}
对于这个问题我已经用其他方式解决了,在A中声明一个int型指针,将指针指向B::x,然后在A中就可以访问B的x变量了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
直接访问静态变量肯定不行,但可以变通一下,通过虚函数获得这个静态变量
给你个例子,这样是不是满足你的要求?
但这样的话,每个继承类都要做2件事
1. 定义静态变量
2. 重写虚函数,返回自己的静态变量
这2件事可以通过宏来做。MFC好象就是这么干的
#include <stdio.h>
class A {
public:
const static int Value = 1;
virtual int getValue() const { return Value; }
};
class B : public A {
public:
const static int Value = 2;
virtual int getValue() const { return B::Value; }
};
int main()
{
A *p = new A();
A *q = new B();
printf("p->value = %d\n", p->getValue());
printf("q->value = %d\n", q->getValue());
getchar();
}
给你个例子,这样是不是满足你的要求?
但这样的话,每个继承类都要做2件事
1. 定义静态变量
2. 重写虚函数,返回自己的静态变量
这2件事可以通过宏来做。MFC好象就是这么干的
#include <stdio.h>
class A {
public:
const static int Value = 1;
virtual int getValue() const { return Value; }
};
class B : public A {
public:
const static int Value = 2;
virtual int getValue() const { return B::Value; }
};
int main()
{
A *p = new A();
A *q = new B();
printf("p->value = %d\n", p->getValue());
printf("q->value = %d\n", q->getValue());
getchar();
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
无法访问。我想你的提问有问题吧?若派生类访问基类应该可以。你问的可能是多态方面的问题,只有声明的基类变量 被赋值为 扩展类的对象时,通过其被实现的方法访问扩展类的方法才行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询