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

2025-02-23 12:54:58
推荐回答(4个)
回答1:

区分成员变量情况,有以下几种情况:
1 子类和父类没有同名成员变量。
此种情况下不会出现任何情况的覆盖。
2 在父类中,有virtual修饰的虚成员变量,在子类中有与其同名同类型的成员变量。
此种情况下,子类变量会覆盖父类变量。
3 在父类中,存在有与子类同名同类型的成员变量,但没有virtual修饰。
此时不会覆盖,但是会重写。即子类中访问成员变量时,访问的是子类的,父类的会被隐藏。但是通过父类名直接调用仍可以使用父类该变量。不属于覆盖,被称为重写。

回答2:

从内存分配的角度上来看,子类继承时,先分配了父类的内存,再分配子类的内存,所以子类中同时存在着父类的空间和新的空间两个部分。当你使用父类函数的时候,显然会使用的是父类中的变量。在子类中增加同名的变量,会使子类的成员变量将父类的覆盖,却不会使父类的函数中的成员发生覆盖。
所以最好的办法就是不在子类中增加新的变量,而是直接使用父类中的变量。

Children() : mStr("Children"){};
protected:
string mStr;
改为
Children() {mStr = "Children"};

回答3:

子类的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;
}

回答4:

是可以的,因为子类和父类有不同的作用域