类方法继承中的C++类

C++ Class in class method inheritance

本文关键字:C++ 继承 类方法      更新时间:2023-10-16

我有以下结构,我想从D调用foo。这怎么可能?我收到了错误消息,我在下面的行中对此进行了评论。

class A
{
protected:
    class B
    {
    public:
        B(x)
        {
            //...
        }
    protected:
        virtual void foo()
        {
            //...
        }
    };
};
class C : public A
{
protected:
    class D : public A::B
    {
    public:
        D(x) : B(x)
        {
            //empty
        }
    };
    void bar()
    {
        D var = D(x);
        var.foo(); //cant access protected member in class A::B
    }
};

foo()是B的受保护成员函数,意味着只允许从其子类(子类)调用foo(。

bar()是C的成员函数,C是A的继承。因此,C不是B的子类。

如果你把条形图放在D,那没关系。代码如下:

class A
{
protected:
    class B
    {
    public:
        B(int x)
        {
            //...
        }
    protected:
        virtual void foo()
        {
            //...
        }
    };
};
class C : public A
{
protected:
    class D : public A::B
    {
    public:
        D(int x) : B(x)
        {
            //empty
        }
        // Here is OK, while D is subclass of B
        void bar()
        {
            int x;
            D var = D(x);
            var.foo(); //cant access protected member in class A::B
        }
    };
    // void bar()
    // {
    //     int x;
    //     D var = D(x);
    //     var.foo(); //cant access protected member in class A::B
    // }
};

int main(){

    return 0;
}

试试朋友类。你可以让D成为B的朋友,这应该允许D调用foo()。

实际上,您正试图从类C访问类D==>的受保护方法您不能从类的外部访问受保护方法。

一种解决方案可以是将C声明为D朋友类,以便C可以访问受保护的方法:

// ...
    class D : public A::B
    {
    public:
        D(x) : B(x)
        {
            //empty
        }
        // Declare C as friend of D
        friend class C;
    };
// ...

添加友谊声明,您的代码将编译并按预期工作。

您可能希望foo()D中是公共的,即使它在A::B 中受到保护

如果是,您可以在D 的定义中的public:行之后添加以下行

using A::B::foo;

谢谢你的回答。公开foo函数确实是一个解决方案,但我确实希望foo只能从继承的类中获得。朋友修饰语是一种东西,很多人讨厌它,因为它让你可以访问一些东西,那是你不应该访问的。

但你们也是对的,我应该从D访问B::foo(在我的情况下,从构造函数访问不是一个选项)。我可以创建一个函数,它调用原始的foo,所以我的解决方案是:

class A
{
protected:
    class B
    {
    public:
        B(x)
        {
            //...
        }
    protected:
        virtual void foo()
        {
            //...
        }
    };
};
class C : public A
{
protected:
    class D : public A::B
    {
    public:
        D(x) : B(x)
        {
            //empty
        }
        Dfoo()
        {
            B::foo();
        }
    };
    void bar()
    {
        D var = D(x);
        var.Dfoo();
    }
};

这个解决方案很简单,但我不知道一个函数(不是静态的)可以这样调用:)