c++中派生类如何访问基类成员变量?
#include<iostream.h>classanimal{public:inta;animal(){a=20;}voideat(){cout<<"animaleat...
#include<iostream.h>
class animal
{
public:
int a;
animal()
{
a=20;
}
void eat()
{
cout<<"animal eat"<<a<<endl;
}
};
class fish:public animal
{
public:
fish()
{}
int t;
void fw()
{
t=animal.a;
}
};
这里就出错了,提示error C2275: 'fish::animal' : illegal use of this type as an expression
};
int main()
{
animal an;
fish fh;
an.eat();
fh.eat();
return 0;
}
复制错了,后面main函数那里没用 展开
class animal
{
public:
int a;
animal()
{
a=20;
}
void eat()
{
cout<<"animal eat"<<a<<endl;
}
};
class fish:public animal
{
public:
fish()
{}
int t;
void fw()
{
t=animal.a;
}
};
这里就出错了,提示error C2275: 'fish::animal' : illegal use of this type as an expression
};
int main()
{
animal an;
fish fh;
an.eat();
fh.eat();
return 0;
}
复制错了,后面main函数那里没用 展开
5个回答
展开全部
问题1:静态变量可以通过继承到子类里,但是你不可能通过子类对X进行第二次初始化,绝对报错
问题2:你可以在子类里去修改这个静态变量,但是在修改这个值之后,即使你去调基类的foo函数,x还是你在子类里已经修改了的值,因为子类和基类的x其实是同一个,他们是同一块内存。
问题3:在基类里没法访问派生类的X。你可以通过多态的特性,在子类父类里写一个虚函数来设置x的值,然后通过使用A的指针去调用B类里的方法。但是对静态变量而言没有什么意义,因为他们是同一个东西,在哪修改都一样。
问题2:你可以在子类里去修改这个静态变量,但是在修改这个值之后,即使你去调基类的foo函数,x还是你在子类里已经修改了的值,因为子类和基类的x其实是同一个,他们是同一块内存。
问题3:在基类里没法访问派生类的X。你可以通过多态的特性,在子类父类里写一个虚函数来设置x的值,然后通过使用A的指针去调用B类里的方法。但是对静态变量而言没有什么意义,因为他们是同一个东西,在哪修改都一样。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
t=animal.a;
这句话不行。a是一个普通成员变量,只有对一个具体的对象,才会有.a这种用法。
这句话不行。a是一个普通成员变量,只有对一个具体的对象,才会有.a这种用法。
追问
那派生类想访问a怎么访问?
追答
想要访问变量a,只能给一个具体的对象,比如你可以给这个函数加个参数:
void fw(animal obj)
{
t=obj.a;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
很简单,fish改成这样就可以了:
class fish:public animal
{
public:
fish(){}
int t;
void fw()
{
t=a;
}
};
因为fish是animal的子类,对于fish的任何一个对象,它也拥有animal的特征,所以a也是fish的。
class fish:public animal
{
public:
fish(){}
int t;
void fw()
{
t=a;
}
};
因为fish是animal的子类,对于fish的任何一个对象,它也拥有animal的特征,所以a也是fish的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这里a是public的可以直接访问
void fw()
{
t=a;
}
当然为了表明它属于基类:
可以
void fw()
{
t=animal::a;
}
如果是protected的也是这样做。
如果你把它弄成private的了,可以在基类中定义public的一个相应的gette/setterr函数即可。
如果实在不想这么做,又想访问,可以用指针的方法无视权限任意涂改,当然你要知道你的目的
别弄错了,因为正常合法是不允许这么做的,但练习无所谓。
void fw()
{
t=a;
}
当然为了表明它属于基类:
可以
void fw()
{
t=animal::a;
}
如果是protected的也是这样做。
如果你把它弄成private的了,可以在基类中定义public的一个相应的gette/setterr函数即可。
如果实在不想这么做,又想访问,可以用指针的方法无视权限任意涂改,当然你要知道你的目的
别弄错了,因为正常合法是不允许这么做的,但练习无所谓。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询