与基类同名的C ++类成员

时间:2012-09-25 11:25:43

标签: c++ gcc

在基类方法中使用时,this指针的行为如何:

class Base{
public:
   int a;
   Base() : a(5) {}
   void func(){
       std::cout << " value is : " << this->a << std::endl;
   }
};

class Derived : public Base{
private:
   int a;
public:
   Derived() : a(1){}
   void func1(){
       std::cout << " value is : " << this->a << std::endl;
   }
};

int main(){
   Derived d;
   d.func();
   d.func1();
}

代码的输出是:

值为:5

值为:1

因为我使用相同的对象来调用这两个函数。那么这个指针的值在base和派生类的方法中会有所不同吗?

3 个答案:

答案 0 :(得分:2)

this->a在该上下文中等同于a,因此它与基指针无关。

成员a是静态解析的,派生类隐藏了基类成员,因为它们都被命名为a

要检查this指针本身,您可以直接打印它:

std::cout << this;

两个对象都是一样的。

要做的主要是Base::aDerived::a不同。请在Derived中尝试以下内容:

void func1(){
    std::cout << "derived value is : " << a << std::endl;
    std::cout << "   base value is : " << Base::a << std::endl;
}

答案 1 :(得分:0)

this指针始终指向当前存在的对象。

调用func时,使用Base类并打印基类字段。但是,

调用func1时,将使用派生类并打印其字段。


尝试评论此行Derived() : a(1){},您会更清晰。

答案 2 :(得分:0)

您必须this->Base::a才能访问Base a。否则,您始终可以访问Derived::a