C ++从派生类

时间:2017-06-18 21:33:37

标签: c++ class c++14

原始问题

MWE :(最小[不]工作示例)

class base
{
protected:
    int b;
};

class derived : public base
{
    friend void incr();
};

void incr()
{
    base::b ++;
}

int main()
{
    return 0;
}

创建此代码是为了演示我在一个更大的项目中遇到的编译器错误。

我有一个带有一些数据成员的基类。然后,我创建一个派生类,以向基类添加其他函数。其中一些函数是友元函数,我认为这些函数可以让我访问基类的受保护成员,但显然不是。我实现了这些函数作为朋友,因为他们在内存块之间复制操作,并且在语法上使它们在外部实现更有意义。

有没有办法解决编译器错误(见下文)而不将这些函数更改为派生类的成员,或者通过添加其他成员函数来获取/设置数据。 (由于增加了复杂性,我真的不想这样做。)

g ++产生的错误:

./src/main_test.cpp: In function ‘void incr()’:
./src/main_test.cpp:7:9: error: ‘int base::b’ is protected
     int b;
         ^
./src/main_test.cpp:17:11: error: within this context
     base::b ++;
           ^
./src/main_test.cpp:7:9: error: invalid use of non-static data member ‘base::b’
     int b;
         ^
./src/main_test.cpp:17:11: error: from this location
     base::b ++;

解决方案

我对成员和非成员函数感到困惑。非成员函数需要一个对象来操作,因为没有这个指针。

class base
{
protected:
    int b;
};

class derived : public base
{
    friend void incr(derived &d);
};

void incr(derived &d)
{
    d.b ++;
}

1 个答案:

答案 0 :(得分:1)

好吧,如果你可以控制基数,你可以在基础上添加朋友(从语义上讲,这是你真正想要做的事情。)

以下代码段编译。 派生类保留其基础的友谊访问权限,而不必渗透到其自己的属性。 incr无法访问derived个私人会员。

class base
{
protected:
    int b;
    friend void incr();
};

class derived : public base
{
};

derived obj;

void incr()
{
    obj.b ++;
}

int main()
{
    return 0;
}

这也有效:

class base
{
protected:
    int b;
};

class derived : public base
{
    friend void incr();
protected:
    int c;

};

derived obj;

void incr()
{
    obj.b ++;
    obj.c ++;
}

int main()
{
    return 0;
}