在 C++ 中,如何从指向驱动 class 的指针访问嵌套 class 的成员
In C++, how to access the members of a nested class from a pointer to the drived class
你能解释一下为什么我在尝试从派生 class 访问嵌套 class 的成员时收到错误消息吗:
class Base
{
public:
static int A;
class inside_Base {public: static int B;};
};
int Base::A = 1;
int Base::inside_Base::B = 2;
class Derived : public Base {};
然后我主要有:
Base * p;
p = new Derived();
当我尝试打印 p->inside_Base::B 时,我收到以下错误:
error: 'Base::inside_Base' is not a base of 'Derived'
谢谢。
正如@V.Kravchenko所说,您不应该通过创建的对象使用静态成员。没有变量多态性,只有函数多态性。
通常你不需要通过Derived
引用inside_Base
,因为你谎称Base::inside_Base
是Derived
的嵌套class。不过如果你很想要,可以typedef
它:
class Derived : public Base
{
public:
typedef Base::inside_Base inside_Base;
};
在这种情况下,您可以编写 Derived::inside_Base::B
,例如(已在 MSVC 9.0 中检查)。但是,当然,它没有多态性,因为 class 是在编译时静态定义的。
p->A
是什么意思?为什么不 p->inside_Base::B
?
p->A
等价于 Base::A
。 C++ 特性允许您将静态变量用作非静态变量。不知道为什么需要它。
var->Class::member
表示您想要来自 class Class
的 member
符号与 var
实例相关。需要解决可能与 var
一起使用的不明确符号。例如:
class Base
{
public:
int x = {1};
};
class Derived
{
public:
int x = {2};
};
void main()
{
Derived var
std::cout << var.x << " " << var.Base::x;
}
输出将是 2 1
。在第二次调用中,我们想要 确切地 Base
的成员。
因此,p->inside_Base::B
表示您想要 B
来自与 p
变量完全相关的 class inside_Base
。但是 inside_Base
不是 p
的 class 也不是派生的。你可能会问:为什么编译器不扫描嵌套的 classes?我认为那是因为没有人需要它。它会使编译复杂化并且不会受益,因为它不会解决任何歧义。
你能解释一下为什么我在尝试从派生 class 访问嵌套 class 的成员时收到错误消息吗:
class Base
{
public:
static int A;
class inside_Base {public: static int B;};
};
int Base::A = 1;
int Base::inside_Base::B = 2;
class Derived : public Base {};
然后我主要有:
Base * p;
p = new Derived();
当我尝试打印 p->inside_Base::B 时,我收到以下错误:
error: 'Base::inside_Base' is not a base of 'Derived'
谢谢。
正如@V.Kravchenko所说,您不应该通过创建的对象使用静态成员。没有变量多态性,只有函数多态性。
通常你不需要通过Derived
引用inside_Base
,因为你谎称Base::inside_Base
是Derived
的嵌套class。不过如果你很想要,可以typedef
它:
class Derived : public Base
{
public:
typedef Base::inside_Base inside_Base;
};
在这种情况下,您可以编写 Derived::inside_Base::B
,例如(已在 MSVC 9.0 中检查)。但是,当然,它没有多态性,因为 class 是在编译时静态定义的。
p->A
是什么意思?为什么不 p->inside_Base::B
?
p->A
等价于 Base::A
。 C++ 特性允许您将静态变量用作非静态变量。不知道为什么需要它。
var->Class::member
表示您想要来自 class Class
的 member
符号与 var
实例相关。需要解决可能与 var
一起使用的不明确符号。例如:
class Base
{
public:
int x = {1};
};
class Derived
{
public:
int x = {2};
};
void main()
{
Derived var
std::cout << var.x << " " << var.Base::x;
}
输出将是 2 1
。在第二次调用中,我们想要 确切地 Base
的成员。
因此,p->inside_Base::B
表示您想要 B
来自与 p
变量完全相关的 class inside_Base
。但是 inside_Base
不是 p
的 class 也不是派生的。你可能会问:为什么编译器不扫描嵌套的 classes?我认为那是因为没有人需要它。它会使编译复杂化并且不会受益,因为它不会解决任何歧义。