在 C++ 中,您可以在基类中放置一个成员,在继承类中放置一个具有相同名称的成员。
如何访问继承类中的特定类?
在这种情况下,您应该完全限定成员名称。
class A
{
public:
int x;
};
class B : public A
{
public:
int x;
B()
{
x = 0;
A::x = 1;
}
};
如果您指定名称,您将自动访问继承类中的名称。如果您的意思是如何访问基类中的那个,请使用 Base::member
要访问基类中的隐藏成员,您必须在成员名称前加上基类名称。见下文:
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;
};
一种方法(在所有其他答案中已经提到)是使用限定的成员名称,例如Base::member
. 如果这是您的风格,它可以与通过this
指针的显式访问结合使用:this->Base::member
.
this
另一种方法是通过显式转换为基类类型的指针执行访问: ((Base *) this)->member
.
当然,上面对this
指针的引用是在您尝试从类的某些非静态成员函数中访问成员的假设下进行的。要从“外部”访问 if,可以将相同的技巧应用于任何其他指针(或引用):some_pointer->Base::member
或((Base *) some_pointer)->member
.
对于数据成员,这两种方法是等效的。对于成员函数,它们可以导致与虚函数不同的结果。因此,一般来说,应首选第一种方法。
是的。
使用类名来限定您的呼叫f()
:SpecificClass::f()
。
通过在它前面加上classname::
.
#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.
}