3
class Method {
  public:    
  virtual void Rum();
};
class Euler : public Method {
  virtual void Rum() {
    printf("ahoj\n");
  }    
};
class Kutta : public Method {
  virtual void Rum() {
    printf("ahoj2\n");
  }    
};
class Simulator {
  public:
  Method *pointer;
  Simulator();
  void setmethod(Method m) { pointer = &m; }
};

int main() {
  Simulator s;
  s.setmethod(new Kutta());
  s.pointer->Rum();
  s.setmethod(new Euler());
  s.pointer->Rum();
}

我希望这个例子足够容易理解。我试图应用继承原则,但我得到了这些错误:(OOP 的东西在我的脑海里似乎有点乱)

prog.cpp: In function ‘int main()’:
prog.cpp:26: error: no matching function for call to ‘Simulator::setmethod(Kutta*)’
prog.cpp:21: note: candidates are: void Simulator::setmethod(Method)
prog.cpp:28: error: no matching function for call to ‘Simulator::setmethod(Euler*)’
prog.cpp:21: note: candidates are: void Simulator::setmethod(Method)

那么传递孩子而不是父母的正确方法是什么?谢谢!

4

2 回答 2

5

您的签名void setmethod(Method m)不正确。它必须void setmethod(Method* m)与您的调用相匹配。

作为旁注,您需要在方法中使用引用或指针才能使多态性起作用——这意味着您不能将参数传递给setmethod按值传递并期望多态性起作用。

于 2012-12-01T21:30:36.183 回答
3

此代码将起作用:

#include <stdio.h>                                                                                                                                                                                                   

class Method {
  public:    
  virtual void Rum() = 0;
};
class Euler : public Method {
  virtual void Rum() {
    printf("ahoj\n");
  }    
};
class Kutta : public Method {
  virtual void Rum() {
    printf("ahoj2\n");
  }    
  virtual void Rum2() {
    printf("ahoj2blah\n");
  }    
};
class Simulator {
  public:
  Method *pointer;
//  Simulator(); // this was only declaration...
  void setmethod(Method* m) { pointer = m; }
};

int main() {
  Simulator s;
  s.setmethod(new Euler());
  s.pointer->Rum();
  s.setmethod(new Kutta());
  s.pointer->Rum();
//  s.pointer->Rum2(); //you can use only functions from Method
}

首先你应该在 Method 中定义 Rum 函数。
还有两个void setmethod(Method m) 不正确的原因:

  1. new 总是返回指向对象的指针
  2. 最重要的一个:
    Compiller 预期的具有 Method 类型的对象,因此它为参数分配了 sizeof(Method) 个字节。
    不幸的是,继承的对象经常有额外的变量,所以他们的大小大于他们父母的大小。这就是为什么函数不能接受带有继承类型的对象。
    好的解决方案是将指针传递给函数,它总是有 8 个字节。不幸的是,您只能使用在我们派生出另一个的类中定义的方法和变量,但是当我们要调用的函数是虚拟的时,将调用被覆盖的函数。
于 2012-12-01T22:49:56.713 回答