派生类无法访问继承的函数?

时间:2011-05-12 14:34:34

标签: c++ inheritance derived

我正在创建一个涉及继承的非常简单的程序。我将一个函数放入父类的“受保护”区域,现在我没有子类的访问权限。这是我的代码:

class Product : protected Item 
{

private:

    double Price;

protected:

    double getPrice(){return Price;}


//other code not connected
};

后来,我得出:

class Toy : protected Item
{

// class Toy code that does not mention getPrice() at all

 };

之后,我派生了另一个类,我实际上尝试使用getPrice()函数。

在新类的头文件中:

class Game : protected Toy
{

  double printGame(){return getPrice();}
};

这一行不会给我一个错误。

但是在文件game.cpp中:

ostream& operator << (ostream& Output, const Game &printedGame)
{
 return Output 

 << "The game price is: "

 //This is the problem line

 << printedGame.printGame()

 << "." ;
 }

单词“printedGame”返回“错误:对象具有与成员函数不兼容的类型限定符”

当我尝试直接(我之前尝试过,因此:)

printedGame.getPrice()

我收到了这个错误,还有一个错误告诉我getPrice()函数无法访问。

这里有什么帮助吗?谢谢!

5 个答案:

答案 0 :(得分:4)

使用<<对象调用const Game &运算符,这意味着该函数只能调用const

Game个成员函数

const添加到getPriceprintGame

double getPrice() const {return Price;}
double printGame() const {return getPrice();}

您还必须公开printGame

答案 1 :(得分:0)

getPrice()方法是Product的成员,而不是Item。因此从Item派生玩具不会让它访问getPrice()。它必须从Product(或其子类之一)派生。

答案 2 :(得分:0)

getPrice成员可以访问

Game,但您的operator<<不是会员,也不是会员。

相反,请使用好友声明来operator<<(ostream&, const Game&)访问。

class Product : protected Item 
{

private:

  double Price;

protected:

  double getPrice() const {return Price;}
};

class Toy : protected Product
{
};

class Game : protected Toy
{
  friend ostream& operator<<(ostream&, const Game&);
};

ostream& operator << (ostream& Output, const Game &printedGame)
{
  return Output 

   << "The game price is: "

   //This is the problem line

   << printedGame.getPrice()

   << "." ;
}

答案 3 :(得分:0)

getPrice()方法是Product类的成员,但是您从Item。

派生

另外 - 如果你这样称呼它,那么我相信你需要一个const函数来调用Product class

答案 4 :(得分:0)

我对此进行了尝试,但必须做出一些假设才能使其发挥作用。 如上所述,代码应该正常工作

#include <iostream>

using std::ostream;

// I added this to make sure it looks close to your stated problem
class Item
{
};

class Product : protected Item 
{
private:    
    double Price;
protected:   
    // getter needs to be const, for the ostream operator to work
    double getPrice() const
    {
        return Price;
    }
};

// I changed this to derive from Product, otherwise, there's no inheritance tree.
// Is this what you intended to do?
class Toy : protected Product
{
};

class Game : protected Toy
{  
    // if you don't specify an access modifier, C++ defaults to private
public:
    // getter needs to be const, for the ostream operator to work
    double printGame() const
    {
        return getPrice();
    }
};

ostream& operator << (ostream& Output, const Game &printedGame)
{
    return Output  << "The game price is: " << printedGame.printGame() << "." ;
}

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}