我正在创建一个涉及继承的非常简单的程序。我将一个函数放入父类的“受保护”区域,现在我没有子类的访问权限。这是我的代码:
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()函数无法访问。
这里有什么帮助吗?谢谢!
答案 0 :(得分:4)
使用<<
对象调用const Game &
运算符,这意味着该函数只能调用const
Game
个成员函数
将const
添加到getPrice
和printGame
:
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;
}