2013-10-20 120 views
1
#include <iostream> 
using namespace std; 

class ShapeTwoD 
{ 
    public: 
     virtual int get_x(int); 




    protected: 
    int x; 
}; 


class Square:public ShapeTwoD 
{  
    public: 
     void set_x(int,int); 

     int get_x(int); 





     private: 
     int x_coordinate[3]; 
     int y_coordinate[3]; 


}; 

int main() 
{ 
    Square* s = new Square; 

s->set_x(0,20); 

cout<<s->get_x(0) 
    <<endl; 




    ShapeTwoD shape[100]; 

    shape[0] = *s; 

cout<<shape->get_x(0); //outputs 100 , it doesn't resolve to 
          // most derived function and output 20 also 


} 

void Square::set_x(int verticenum,int value) 
{ 
    x_coordinate[verticenum] = value; 

} 


int Square::get_x(int verticenum) 
{ 
    return this->x_coordinate[verticenum]; 

} 

int ShapeTwoD::get_x(int verticenum) 
{ 
    return 100; 

} 

shape [0]已被初始化爲Square。當我調用shape-> get_x時,我無法理解 爲什麼shape-> get_x不能解析爲最派生類,而是解析爲shape-> get_x的基類 類方法。我已經在我的基類中創建了get_x方法。虛擬函數不能解決大多數派生類方法

有人可以向我解釋爲什麼以及如何解決這個問題?

+0

我有似曾相識VOUS –

+0

你已經得到了'ShapeTwoD'的,不是的'Square's數組的數組。查看「對象切片」。 – jrok

+1

可能重複[C++中的切片問題是什麼?](http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c) – jrok

回答

7

在這些線路:

ShapeTwoD shape[100]; 
shape[0] = *s; 

你有 「切片」。您的shape數組包含ShapeTwoD s,您從*s指定到第一個ShapeTwoD。這不會改變shape[0]的類型,所以它是而不是類型爲Square的對象。當您使用指針多態性才能奏效:

ShapeTwoD* shape[100]; // now you have 100 (uninitialized) pointers 
shape[0] = s; 

cout << shape[0]->get_x(0); 
+0

謝謝,感謝您的幫助 – Computernerd