从基类覆盖虚方法

时间:2013-05-11 12:34:11

标签: c++ inheritance pure-virtual

我正在Visual C ++ 2010中编写一个小程序。当有问题的类被分成*.h时,我遇到了一些麻烦实现从一些抽象类继承的纯虚函数*.cpp个文件。

这是Sir.h文件,我在其中声明了我的类和方法,Sir是一个基类:

class Sir{
protected : Uint _count; 
            TVint _elemente; 

public : Sir();
         virtual ~Sir(){}
         Uint operator[] (int index);
         Sir& operator() (int index);
         friend ostream& operator << (ostream &out, const Sir &sir);

protected : virtual void CalculateValues(int index)=0;
}
class Fibonacci:public Sir{
enum { MAX_FIB = 47 };

using Sir::CalculateValues;
void CalculateValues(int index);
}

这是Sir.cpp:

 #include "Sir.h"

    Sir::Sir(){_count=0;}

    Uint Sir::operator[](int index)
                 {
                        if(index<0)
                            ParameterOutOfBounds();
                        else{_count=index+1;}
                        return _elemente[_count];
                 }
    Sir& Sir::operator()(int index){operator[] (index);}

    void Fibonacci::CalculateValues(int index){

            if(index<Fibonacci::MAX_FIB)
            {Fibonacci::_elemente.push_back(1);
             Fibonacci::_elemente.push_back(1);
             while(_elemente.size()<_count)
            Fibonacci::_elemente.push_back(_elemente[_elemente.size()-1]+_elemente[_elemente.size()-2]);
                }
            else ParameterOutOfBounds();

      }
ostream& operator << (ostream &out, const Sir &sir)
       {
          cout<<"Index  Value"<<endl;
          cout<<"--------------------"<<endl;
          for(int i=0;i<_count;i++)
          cout<<i<<"    "<<_elemente[_count]<<endl;
        }

这是testSir.cpp文件:

#include "Sir.h";
#include<iostream>;
#include"Calc\Exceptions.h";
using namespace std;

int main(){

     Sir * fib=new Fibonacci;
     fib->CalculateValues(1); //Error : function is inaccessible
     system("PAUSE");
     return 0;
}

我收到错误:错误:函数“Sir :: CalculateValues”无法访问。我该如何解决这个问题?

编辑:

受保护是我的坏事。现在我在Sir * fib=new Fibonacci;遇到了另一个问题 我得到“错误:抽象类类型的对象”Fibonacci“不允许”。

2 个答案:

答案 0 :(得分:1)

该方法无法访问,因为它声明为protected

protected : virtual void CalculateValues(int index)=0;

将其添加到public :

public : Sir();
         virtual ~Sir(){}
         Uint operator[] (int index);
         Sir& operator() (int index);
         friend ostream& operator << (ostream &out, const Sir &sir);
         virtual void CalculateValues(int index)=0;

同样适用于Fibonacci类(仅限相关方法)

protected方法只能由声明它或其任何衍生物的类

访问

答案 1 :(得分:0)

CalculateValues被声明为受保护,因此只能从子类{of Sir类访问它。

如果您希望它可以从任何其他类调用,则声明 public