2012-12-01 56 views
1
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(); 
} 

我希望這個例子足夠容易理解。我嘗試應用繼承的原則,但我得到這些錯誤:(面向對象的東西似乎有點在我的腦海混亂)把子類傳給父類的方法

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) 

那麼什麼是合格的,而不是父子正確的方法是什麼?謝謝!

+0

\ *打哈欠\ *切片 –

回答

4

void setmethod(Method m)的簽名不正確。它必須是void setmethod(Method* m)以匹配您的調用。

作爲一個方面說明,您需要在方法中使用多態性的引用或指針才能正常工作 - 這意味着您無法通過值將參數傳遞給setmethod,並期望多態性能夠正常工作。

+0

感謝您的回覆。我試過了,結果如下 - http://ideone.com/djw5tb – milano

+1

這是另一個問題 - 你聲明瞭構造函數,但沒有定義它。用'Simulator(){}'替換'Simulator();'。 – SomeWittyUsername

+0

好吧,這裏是另一個錯誤:http://ideone.com/1Yzq79 – milano

2

此代碼將工作:

所有的
#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 
} 

首先,你應該在方法定義朗姆酒功能。
也有兩個原因void setmethod(Method m) 是不正確的:

  1. new always returns pointer to object
  2. 和最重要的一條:
    與方法類型Compiller預期的對象,因此它分配給參數的sizeof(方法)字節。
    不幸的繼承對象通常有額外的變量,所以thier size is greater than size thier parents。這就是爲什麼函數不能接受嵌入類型的對象。
    好的解決方案是將指針傳遞給總是有8個字節的函數。 不幸的是,您只能使用方法和變量在派生另一個類的方法中定義的變量,但是當我們想要調用的函數是虛擬的時,覆蓋的函數就會調用。
+0

很好的解釋,謝謝。 – milano