C ++中的Upcasting是否允许访问Parent的私有成员或朋友

时间:2016-03-17 02:56:56

标签: c++ inheritance friend

根据我在课堂上学到的,派生类不会继承它们的父类:

  • 构造器/解析器
  • 私人会员

但是,如果我们将派生类升级到其父类,我们是否可以访问父类的私有成员,并且Parent类的朋友现在是否会应用于此upcasted类?

我倾向于认为上升的派生类将无法访问父级的私有方法和变量,因为派生类首先没有继承它们。

(以下代码是在验证确认答案后添加的)

这个c ++代码用于测试我问的问题:

    #include <iostream>
    class A;
    void funcGetAVal(A);

    class A
    {
        private:

            int aVal;
            friend void ::funcGetAVal(A);
        public:
            A()
            {
                aVal = 0;
            }
    };

    class B : public A
    {
        public:
            int bVal;
            B() : A()
            {
                bVal = 0;
            }
    };

    void funcGetAVal(A aClass)
    {
        std::cout << "A val accessed from friend function: " << aClass.aVal << std::endl;
    }


    int main()
    {
        B * b = new B;
        A * a = new A;
        A * bNowA = reinterpret_cast<A *>(b); //This reinterprets the instance of the derived class into an instance of the base class
        //std::cout << bNowA->aVal << std::endl; //This caused a compile-time error since aVal is a private member of A
        ::funcGetAVal(*a); //This calls the funcGetAVal function with an instance of the base class
        ::funcGetAVal(*bNowA); //This calls the funcGetAVal function with an instance of the derived class reinterpreted as the base class
        //Both funcGetAVal function calls print out 0
        return 0;
    }

结果与R Sahu的答案一致。从B实例访问A的私有成员导致错误,并且友元函数能够访问派生类的aVal。

1 个答案:

答案 0 :(得分:1)

  

但是,如果我们将派生类升级到其父类,我们是否可以访问父类的私有成员

没有

可以在类的范围内访问类的

private个成员。类的成员函数可以访问其私有成员。通过将派生类指针向上转换为不是基类成员函数的函数中的基类指针,您将无法访问基类的private成员。您只能访问其public成员。

  

父母班的朋友现在是否会申请这个上升课程?

如果将指向基类的指针传递给基类的friend,那么友元函数可以访问基类的privateprotected成员。