C ++如何创建创建派生类对象的基类,并访问基类的私有成员?

时间:2017-07-11 14:27:00

标签: c++ inheritance derived-class base-class

我有没有办法derived class访问private的{​​{1}}成员,同时能够创建base class个对象derived内的base class方法?

这样的事情:

base class

错误如下:

class Derived;

class Base
{
public:
    void func()
    {
        // I want to create the derived obj here
        Derived derived;
        derived.func();
    }
public:
    int mBase = 5;
};

class Derived : public Base
{
public:
    void func()
    {
        // I need to have access to the private members of Base inside this method
        mBase = 6; 
    }
};

我该怎么办?

谢谢

3 个答案:

答案 0 :(得分:4)

为了能够使用Derived类并在其中调用成员函数(包括构造函数和析构函数),完整定义需要可用。在这种情况下,它不在Base::func函数中。

解决方案很简单:不要定义func内联,只需声明它,然后在定义Derived类后实现(定义)它。

答案 1 :(得分:3)

  

访问基类私有成员的派生类

通常只需撰写protected而不是private。你有什么理由不能这样做吗?

Error: derived uses undefined class Derived.

只需在基类定义中声明 func,并且在定义派生类之后只定义

class Base {
public:
    void func();
protected:
    int mBase = 5;
};

class Derived : public Base {
public:
    void func() {
        mBase = 6; 
    }
};

void Base::func() {
    Derived derived;
    derived.func();
}

答案 2 :(得分:1)

您应该阅读 polymorphism 。你可能想要的是make func()virtual:

class Base
{
public:
    virtual void func() { /* Base behavior */ } // or pure = 0
    virtual ~Base() = default; // don't forget!
public:
    int mBase = 5;
};

class Derived : public Base
{
public:
    void func() override
    {
        // Derived behavior
    }
};

关于访问Base::mBase,您有两种选择:

  • 使mBase受保护
  • 添加您在Derived中使用的受保护的setter来修改它。