我具有以下结构,我想从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的子类。

如果将bar放在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;
}

关于c++ - C++类中的类方法继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33960473/

10-11 22:10
查看更多