中易网

C++的基类如何访问其派生类的成员变量?

答案:8  悬赏:0  
解决时间 2021-01-14 10:07
  • 提问者网友:心如荒岛囚我终老
  • 2021-01-13 13:40
C++的基类如何访问其派生类的成员变量?
最佳答案
  • 二级知识专家网友:酒者煙囻
  • 2021-01-13 14:16
C++中派生类对基类成员的访问形式主要有以下两种:
1、内部访问:由派生类中新增成员对基类继承来的成员的访问。
2、对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。
三种继承方式下,派生类对基类成员的访问规则。
1、私有继承的访问规则

2、公有继承的访问规则

3、保护继承的访问规则

全部回答
  • 1楼网友:底特律间谍
  • 2021-01-13 18:29
在C++中静态变量在内存中只创建一个由所有的基类和派生类共享这个变量。所以你应该看看是否初始化有没有问题
  • 2楼网友:山君与见山
  • 2021-01-13 16:59
不能访问吧
  • 3楼网友:躲不过心动
  • 2021-01-13 16:51
静态变量只有一个怎么能两次初始化追问基类定义了一个静态成员变量,并将其初始化为1
然后的初始化是在派生类中进行的。
编译运行是可以通过的,下断点查看this指针也可以看得出来,派生类B中有静态成员变量x,值为2,基类也有一个静态成员变量对象x,值为1
  • 4楼网友:詩光轨車
  • 2021-01-13 16:43
class Base
{
public:
static string ba;
};
string Base::ba="fool";
class Derived : public Base
{
};
void main()
{
cout< cout< Derived de;
de.ba="new life";
cout< cout<}

自己编译下就清楚了
  • 5楼网友:不想翻身的咸鱼
  • 2021-01-13 16:36
问题1:静态变量可以通过继承到子类里,但是你不可能通过子类对X进行第二次初始化,绝对报错
问题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变量了
  • 6楼网友:患得患失的劫
  • 2021-01-13 15:53
基类根本就不能访问派生类的成员,只有基类指针在虚拟继承链上即多态的情况下才可以访问派生类对象的成员。
你是在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呢?
  • 7楼网友:西风乍起
  • 2021-01-13 15:40
直接访问静态变量肯定不行,但可以变通一下,通过虚函数获得这个静态变量
给你个例子,这样是不是满足你的要求?

但这样的话,每个继承类都要做2件事
1. 定义静态变量
2. 重写虚函数,返回自己的静态变量

这2件事可以通过宏来做。MFC好象就是这么干的

#include
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();
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息