子类作为参数?

时间:2011-02-27 17:14:31

标签: c++ templates function arguments subclass

我正在尝试创建这样的东西:

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变量?

3 个答案:

答案 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,以便只有类本身以及子类才能访问它。