C ++ OOP测验问题

时间:2011-05-12 11:50:40

标签: 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;
}

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

 error: 'virtual int Base::getN()' is private

6 个答案:

答案 0 :(得分:14)

默认情况下,类 1 的每个成员都是private,基类中的getN被声明为private

getN公开为:

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

1。我的意思是,用关键字class定义的类。请注意,根据C ++标准,可以使用关键字structunion定义类。


编辑:

如果您认为SubClassBase的朋友,那么它可以从外部访问Base的私人成员,那就错了。 friend表示SubClass的成员函数可以访问Base类的私有成员。

但是,如果您main()成为Base的朋友,那么您的代码就可以运作:

 class Base {
        friend int main(); //make main() friend of Base
        //...
    };

现在来自main(),可以访问Base的所有私人成员!

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

答案 1 :(得分:4)

你的编译器应该给你一些线索......

% g++ -Wall -Wextra -Wshadow -Weffc++ test.cpp
test.cpp:1: warning: ‘class Base’ has virtual functions but non-virtual destructor
test.cpp:10: warning: ‘class SubClass’ has virtual functions but non-virtual destructor
test.cpp: In constructor ‘Base::Base()’:
test.cpp:1: warning: ‘Base::n’ should be initialized in the member initialization list
test.cpp: In constructor ‘SubClass::SubClass()’:
test.cpp:12: note: synthesized method ‘Base::Base()’ first required here 
test.cpp: In copy constructor ‘SubClass::SubClass(const SubClass&)’:
test.cpp:13: warning: base class ‘class Base’ should be explicitly initialized in the copy constructor
test.cpp: At global scope:
test.cpp:13: warning: unused parameter ‘s’
test.cpp: In function ‘int main()’:
test.cpp:4: error: ‘virtual int Base::getN()’ is private
test.cpp:19: error: within this context
test.cpp:4: error: ‘virtual int Base::getN()’ is private
test.cpp:21: error: within this context
test.cpp:21: warning: unused variable ‘x’

答案 2 :(得分:3)

错误消息显示全部:getN隐式private,这是C ++中类的默认值。

使用

class Base {
 // ...

public:
   virtual int getN();
};

使其成为可公开访问的成员。 SubClassBase的朋友而getN的朋友通过Subclass这里的问题来调用的事实 - getN只是简单的事实无法从main()内部访问,从中调用它。不过,您可以main friendBase

答案 3 :(得分:2)

功能

virtual int getN() { /*...*/ }

在您的Base类中是私有的(默认情况下)。因为它在你的SubClass中没有超载,所以当你在main函数中调用它时它会保持私有状态。

如果您想使其合法化,请在课堂上公开:

public:
    virtual int getN() { /*...*/ }

答案 4 :(得分:2)

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

类成员默认为私有

答案 5 :(得分:0)

您不能在将其设为公开状态之前访问getN()