class 继承保护访问

class inheritance protected access

我正在玩我创建的测试 class。代码链接如下。

template<bool...rest_of_string>
class bitstring
{
public:
    void print_this_handler()
    {
        cout << " END";
    }
};

template<bool A, bool... rest_of_string>
class bitstring<A, rest_of_string...> : public bitstring<rest_of_string...>
{
public:
    static const bool value = A;

    bitstring(){}

    void print_this()
    {
        cout << "\nPrinting Bitstring with " << sizeof...(rest_of_string) << " bits: ";
        print_this_handler();
    }
protected:

    void print_this_handler()
    {
        cout << A;
        static_cast<bitstring<rest_of_string...> >(*this).print_this_handler();
    }
};

int main()
{
    bitstring<0,1,0,1,0,1,1,0> str;
    str.print_this();
}
当我从 print_this() 内部调用 print_this_handler() 时,

我 运行 出错了。它说 print_this_handler() 在 class 位串中受到保护。但是,每个class都是从bitstring派生出来的,为什么我不能访问下一个最高的class呢?当我将 protected 更改为 public 时,一切正常,但我很好奇为什么这不起作用。谢谢。

下面复制了准确​​的错误消息:

C:\Users\main.cpp|195|error: 'void bitstring<A, rest_of_string ...>::print_this_handler() [with bool A = true; bool ...rest_of_string = {false, true, false, true, true, false}]' is protected within this context|

您正在尝试调用基数 class print_this_handler 因此您只需要指定基数 class 并直接调用它,尝试通过转换指针来实现你这个问题。如果你这样想,当你将 this 指针指向基 class 时,就好像你创建了一个基 class 的实例,然后试图调用一个受保护的成员函数。你不能那样做,但如果你只是添加消歧来指定基本 class 函数就没有问题,你可以直接调用它。您可以查看此 SO question/answer 以获得更多说明和解释:

更改此行:

static_cast<bitstring<rest_of_string...> >(*this).print_this_handler();

为此:

bitstring<rest_of_string...>::print_this_handler();