20

在 C++ 中,您可以在基类中放置一个成员,在继承类中放置一个具有相同名称的成员。

如何访问继承类中的特定类?

4

7 回答 7

36

在这种情况下,您应该完全限定成员名称。

class A
{
public:
  int x;
};


class B : public A
{
public:
  int x;
  B() 
  { 
    x = 0;
    A::x = 1;
  }
};
于 2010-04-13T16:05:59.753 回答
9

如果您指定名称,您将自动访问继承类中的名称。如果您的意思是如何访问基类中的那个,请使用 Base::member

于 2010-04-13T16:06:19.710 回答
8

要访问基类中的隐藏成员,您必须在成员名称前加上基类名称。见下文:

class A
{
protected:
   int i;
};

class B : public A
{
public:
   void foo( void )
   {
      int a_i = A::i;
      int b_i = i;
      int b_i_as_well = B::i;
   }
private:
   int i;
};
于 2010-04-13T16:06:49.360 回答
6

一种方法(在所有其他答案中已经提到)是使用限定的成员名称,例如Base::member. 如果这是您的风格,它可以与通过this指针的显式访问结合使用:this->Base::member.

this另一种方法是通过显式转换为基类类型的指针执行访问: ((Base *) this)->member.

当然,上面对this指针的引用是在您尝试从类的某些非静态成员函数中访问成员的假设下进行的。要从“外部”访问 if,可以将相同的技巧应用于任何其他指针(或引用):some_pointer->Base::member((Base *) some_pointer)->member.

对于数据成员,这两种方法是等效的。对于成员函数,它们可以导致与虚函数不同的结果。因此,一般来说,应首选第一种方法。

于 2010-04-13T16:26:13.767 回答
5

是的。

使用类名来限定您的呼叫f()SpecificClass::f()

于 2010-04-13T16:06:40.443 回答
4

通过在它前面加上classname::.

于 2010-04-13T16:06:01.567 回答
3
#include <iostream>
using namespace std;

struct Base {
    int memfcn();
};

struct Derived : Base {
    int memfcn(int);
};

int main() {
    Derived d;
    Base b;
    d.Base::memfcn();  //you can even use :: in conjunction with dot(.). This is new to me.
}
于 2018-07-26T09:53:38.720 回答