C++ OOP测验问题

Adr*_*ian 6 c++

我正在做一个C++测验,我需要在下面的代码中说明什么错误:

class Base {
    friend class SubClass;
    int n;
    virtual int getN()
    {
        return n;
    }
};

class SubClass: public Base {
public:
    SubClass() {}
    SubClass(const SubClass& s) {}
};

int main()
{
    SubClass sc;
    if(sc.getN() <= 5)
    {
        int x = sc.getN();
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

除了n是没有资源的,也许应该通过Base类指针创建对象,还有什么可能是错的?
当我运行它时,我收到此错误:

 error: 'virtual int Base::getN()' is private
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 14

作为默认的一类的每一个成员1private,getN在基类被声明private.

getN公众:

class Base {
    friend class SubClass;
    int n;
public: //<--------------------- you forgot this
    virtual int getN()
    {
        return n;
    }
};
Run Code Online (Sandbox Code Playgroud)

我的意思是,用关键字定义的类class.注意,类可以用关键字来定义structunion为好,根据C++标准.


编辑:

如果你认为因为SubClass是朋友Base,所以它可以Base从外部访问私人成员,那就错了.friend表示SubClass可以访问Base类的私有成员的成员函数.

但是,如果你交了main()朋友Base,那么你的代码就可以了:

 class Base {
        friend int main(); //make main() friend of Base
        //...
    };
Run Code Online (Sandbox Code Playgroud)

现在main(),Base可以访问任何私人会员!

请参阅此演示:http://www.ideone.com/UKkCF

  • @Nawaz:是的,如果 SubClass 是 base 的朋友,那么完全合乎逻辑,只有 SubClass 可以访问私人成员,没有其他人,我犯了一个愚蠢的错误:) (2认同)