我正在尝试创建这样的东西:
class food
{
public:
void EAT(); //Whatever happens...
int bitesLeft //This is decreased by one each time you eat the food
};
class cheese: public food
{
public:
void EAT(); //Some overloaded form of the "eat" command...
};
有没有办法在运行时创建其中一个,并且有一个函数可以将任何一个作为参数而不搞砸每个的bitesLeft变量?
答案 0 :(得分:2)
我假设你想要这样的东西:
function doStuff(food * f) {
f->EAT();
}
如果传入奶酪,您希望此调用专用EAT
,或者传入food
时调用非专用形式。在这种情况下,您需要虚拟功能:
class food {
public:
virtual void EAT();
virtual ~food(); // Any class being used polymorphically should have
// a virtual destructor
}
class cheese : public food {
public:
virtual void EAT();
}
我不确定你的意思是'没有搞砸bytesLeft
变量。这是一个公共数据成员,因此任何代码都可以以您不期望的方式修改变量的值。这包括cheese
类中的代码,但也包括不属于任何类的代码。
如果您想阻止cheese.EAT
方法中的代码修改bitesLeft
成员,那么您应该在基类中将其声明为private
。
答案 1 :(得分:0)
两个对象的成员变量是分开的。此代码按预期工作:
void AFunction( food& x ) {
x.EAT();
}
food a;
a.bitesLeft = 10;
cheese b;
b.bitesLeft = 5;
AFunction(a); // a.bitesLeft --> 9
AFunction(b); // b.bitesLeft --> 4
答案 2 :(得分:0)
是的,有:
void myfunc(food* f)
{
f->EAT();
}
int main()
{
food f;
cheese c;
myfunc(&f);
myfunc(&c);
return 0;
}
但是,要实现这一点,您需要在食物类中将EAT()声明为虚拟,如virtual void EAT();
中所示。此外,您可能希望将bitesLeft声明为protected,以便只有类本身以及子类才能访问它。