【问题标题】:Overriding virtual method from base class从基类重写虚方法
【发布时间】:2013-05-06 00:22:46
【问题描述】:

我正在用 Visual C++ 2010 编写一个小程序。当相关类分为 *.h 和 @ 987654322@文件。

这是我声明我的类和方法的 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; 遇到了另一个问题 我收到“错误:不允许抽象类类型“斐波那契”的对象”。

【问题讨论】:

  • 关于您的编辑,我没有从您的代码中得到该错误。但是,您显然没有发布您正在编译的代码,因为它充满了语法错误。听起来要么您没有正确覆盖CalculateValues(您在发布的代码中拥有),或者实际代码包含另一个您尚未覆盖的纯虚函数。

标签: c++ inheritance pure-virtual


【解决方案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 方法只能由声明它的类或其任何派生类访问

【讨论】:

  • 谢谢你,但现在我有另一个问题 -Sir * fib=new Fibonacci; - “错误:抽象类类型“斐波那契”的对象是不允许的
  • 你为什么使用以下行:“使用 Sir::CalculateValues;” ?.而且在您的 Fibonacci 类中,您需要像在父类中一样显式地将 CalculateValues 声明为 public。如果没有使用访问说明符,那么 private 是默认值,而对于此方法它应该是 public
【解决方案2】:

CalculateValues 被声明为 protected,因此只能从 Sir 类的 subclasses.of 访问它。

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

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 1970-01-01
    • 2011-01-05
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    相关资源
    最近更新 更多