在 C++ 中,如何从指向驱动类的指针访问嵌套类的成员

In C++, how to access the members of a nested class from a pointer to the drived class

本文关键字:指针 访问 成员 嵌套 C++      更新时间:2023-10-16

你能解释一下为什么我在尝试从派生类访问嵌套类的成员时收到错误吗:

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_BaseDerived的嵌套类。但如果你非常想要它,你可以typedef它:

class Derived : public Base
{
public:
    typedef Base::inside_Base   inside_Base;
};

在这种情况下,您可以编写 Derived::inside_Base::B ,例如(在 MSVC 9.0 中检查)。但是,当然,它没有多态性,因为类是在编译时静态定义的。

p->A是什么意思?为什么不p->inside_Base::B

p->A相当于Base::A。C++允许您将静态变量用作非静态变量的功能。不知道为什么需要它。

var->Class::member表示您需要与var实例相关的类Class中的member符号。需要解决可能与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说你想要一个与变量相关的类inside_Base B p。但inside_Base不是p的类,也不是派生类。你可以问:为什么编译器不扫描嵌套类?我认为这是因为没有人需要它。这将使编译复杂化,并且不会受益,因为它不会解决任何歧义。