2013-05-11 117 views
2

我在Visual C++编写2010的一个小程序遇到一些麻烦实现从一些抽象类,当所讨论的类被分成*.h*.cpp和继承文件纯虚函数重写虚拟方法

这是我宣布我的类和方法Sir.h文件,爵士是一个基类:

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; 我得到“错误:抽象类类型的对象”斐波那契“不允许”。

+0

关于你的编辑,我没有从你的代码中得到这个错误。然而,你显然没有发布你正在编译的代码,因为它充满了语法错误。这听起来像是你没有正确地覆盖'CalculateValues'(你在发布的代码中),或者真正的代码包含了另一个你没有覆盖的纯虚函数。 – 2013-05-11 13:28:26

回答

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方法只能访问类的声明,或任何的它的衍生物

+0

谢谢,但现在我有另一个问题-Sir * fib = new Fibonacci; - “错误:不允许使用抽象类类型”Fibonacci“的对象 – Dubioz 2013-05-11 12:43:40

+0

为什么使用以下行:”using Sir :: CalculateValues;“?。另外在您的斐波纳契类中,您需要明确声明CalculateValues为public父类。如果没有使用访问说明符,那么private是默认值,而对于此方法应该是public – giorashc 2013-05-11 17:46:23

0

CalculateValues被宣布为受保护,因此它只能从Sir类的子类访问。

声明它public如果你想让它可以从任何其他类中调用。