永发信息网

C++中子类的变量能不能覆盖父类的变量?

答案:4  悬赏:70  手机版
解决时间 2021-11-16 09:26
  • 提问者网友:浩歌待明月
  • 2021-11-16 05:10
C++中子类的变量能不能覆盖父类的变量?
最佳答案
  • 五星知识达人网友:轮獄道
  • 2021-11-16 05:49
区分成员变量情况,有以下几种情况:
1 子类和父类没有同名成员变量。
此种情况下不会出现任何情况的覆盖。
2 在父类中,有virtual修饰的虚成员变量,在子类中有与其同名同类型的成员变量。
此种情况下,子类变量会覆盖父类变量。
3 在父类中,存在有与子类同名同类型的成员变量,但没有virtual修饰。
此时不会覆盖,但是会重写。即子类中访问成员变量时,访问的是子类的,父类的会被隐藏。但是通过父类名直接调用仍可以使用父类该变量。不属于覆盖,被称为重写。
全部回答
  • 1楼网友:平生事
  • 2021-11-16 07:18
子类的mStr和父类的mStr是不同的东西,你在子类中调用:
mStr
this->mStr
都是子类的变量,

Parent::mStr
才是父类的变量。

#include

class Parent
{
public:
Parent() : m_nVal(0) {}
virtual void Show()
{
assert(m_nVal == 0);
}
protected:
int m_nVal;
};

class Son : public Parent
{
public:
Son() : m_nVal(1) {}
virtual void Show()
{
assert(Parent::m_nVal == 0);
assert(m_nVal == 1);
assert(this->m_nVal == 1);
}
private:
int m_nVal;
};

int _tmain(int argc, _TCHAR* argv[])
{
Son s;
s.Show();
return 0;
}
  • 2楼网友:酒醒三更
  • 2021-11-16 07:12
是可以的,因为子类和父类有不同的作用域
  • 3楼网友:傲气稳了全场
  • 2021-11-16 07:07
从内存分配的角度上来看,子类继承时,先分配了父类的内存,再分配子类的内存,所以子类中同时存在着父类的空间和新的空间两个部分。当你使用父类函数的时候,显然会使用的是父类中的变量。在子类中增加同名的变量,会使子类的成员变量将父类的覆盖,却不会使父类的函数中的成员发生覆盖。
所以最好的办法就是不在子类中增加新的变量,而是直接使用父类中的变量。

Children() : mStr("Children"){};
protected:
string mStr;
改为
Children() {mStr = "Children"};追问如果mStr被定义为常量那怎么办?
或者说父类中的一个函数被不同的子类使用,而此函数需要使用 对应不同子类的不同常量。追答~呃~ 如果一定要父类使用子类的变量的话,在父类的成员函数中增加一个传参的函数,构造函数里面使用它从子类传入参数。这样子也不是很方便的,还不如重载一个函数。
总之,父类使用子类的变量是很少用的,不同的子类有不同的要求尽量用重载函数的形式使用。
如果均相同就如我一开始讲的方法。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯