如何访问派生类中的受保护成员?

Aqu*_*irl 4 c++ inheritance

来自http://www.parashift.com/c++-faq-lite/basics-of-inheritance.html#faq-19.5

在类的受保护部分中声明的成员(数据成员或成员函数)只能由该类的成员函数和朋友以及派生类的成员函数和朋友访问

那么,fun在派生类中访问受保护函数的方法是什么?

#include <iostream>
using namespace std;

class X
{
    private:
        int var;
    protected:
        void fun () 
        {
            var = 10;
            cout << "\nFrom X" << var; 
        }
};

class Y : public X
{
    private:
        int var;
    public:
        void fun () 
        {
            var = 20;
            cout << "\nFrom Y" << var;
        }

        void call ()
        {
            fun ();

            X objX;
            objX.fun ();
        }
};
Run Code Online (Sandbox Code Playgroud)

这导致:

anisha@linux-dopx:~/> g++ type.cpp
type.cpp: In member function ‘void Y::call()’:
type.cpp:9:8: error: ‘void X::fun()’ is protected
type.cpp:32:14: error: within this context
Run Code Online (Sandbox Code Playgroud)

我看到了这一点:访问派生类中的受保护成员

鉴于:

您只能访问类型实例中的受保护成员(或从您的类型派生).您无法访问父级或堂兄类型的实例的受保护成员.

在您的情况下,Derived类只能访问Derived实例的b成员,而不能访问其他Base实例.

更改构造函数以获取Derived实例也将解决该问题.

如何在不更改构造函数声明的情况下完成此操作?

0lu*_*sz0 7

我认为你要做的事情应该是这样的:

#include <iostream>
using namespace std;

class X
{
    private:
        int var;
protected:
    virtual void fun () 
    {
        var = 10;
        cout << "\nFrom X" << var; 
    }
};

class Y : public X
{
private:
    int var;
public:
    virtual void fun () 
    {
        var = 20;
        cout << "\nFrom Y" << var;
    }

    void call ()
    {
        fun ();


        X::fun ();
    }
};
Run Code Online (Sandbox Code Playgroud)

这样您就可以从基类中调用hiden成员.否则你必须添加朋友X,因为它在其他帖子中指向.

  • 这是一个完全不同的用例.这是在`*this`上调用`X :: fun`,而不是在`X`类型的对象上调用它,它不是`Y`对象的基类,这是在问题中尝试的对象. (3认同)

Any*_*orn 6

一种解决方案是添加friend class Y到X.