2013-10-11 2 views
0

У меня 2 классов: ShapeTwoD & Squareнаиважнейшая метод базового класса с помощью виртуальной не работает

площади происходит от ShapeTwoD

Класс ShapeTwoD площади Класс

class ShapeTwoD 
{ 
public: 
ShapeTwoD(); 
ShapeTwoD(string,bool); 

string getName(); 
void setName(string); 

bool getContainsWarpSpace(); 
void setContainsWarpSpace(bool); 

void toString(); 

virtual double computeArea(){return 2+3.0}; 

virtual bool isPointInShape(int,int); 
virtual bool isPointOnShape(int,int); 



private: 
string name; 
bool containsWarpSpace; 


}; 

#include "ShapeTwoD.h" 
    class Square:public ShapeTwoD 
{ 
public: 
virtual double computeArea(){return 2+4.0}; 

}; 

В моем основном методе я пытаюсь вызвать квадратные версии метода computeArea(), вместо этого я продолжаю вызывать версию ShapeTwoD метода computeArea(). Я читал в Интернете, что размещение ключевого слова виртуального позволит способу определить динамически, следовательно, позволяет мне назвать квадрат версии методы computeArea()

Почему это происходит и как я называю квадратные версии метод computeArea()

using namespace std; 

#include "Square.h" 

int main() 
{ 

    Square s; 
    s.setName("Sponge"); 
    cout<<s.computeArea(); //outputs 5 when i expect it to output 6 
} 
+0

Ваш должен устранить проблему при составлении кода примера. Это [должно выводить 6] (http://ideone.com/aBuRid) после тривиальных исправлений. – juanchopanza

+1

Даже без виртуального экземпляра 'Square' вызовет функцию' computeArea' в 'Square'. Я согласен, что это не тот код, с которым вы столкнулись. –

+0

имеет значение, если я включаю только файл заголовков класса Square в основной метод, см. Правки – Computernerd

ответ

2

Эта работа и вернуться 6, как ожидается, для меня:

class ShapeTwoD { 
public: 
    virtual double computeArea(){return 2+3.0;}; 
}; 

class Square:public ShapeTwoD 
{ 
public: 
    virtual double computeArea(){return 2+4.0;};  
}; 

мне пришлось добавить ; прежде, чем } как в computeArea, вы пропустили только в примере? Возможно, вы не используете последнюю сборку.

редактировать

включаемый не имеет значения, так как файлы включены, как если бы они кодируются, где вы включите их.

Если вы используете gcc/g++ (но я думаю, другие компиляторы имеют схожие опции), вы можете использовать опцию -E, чтобы увидеть, как результат .c/.cpp файла после фазы предварительной компиляции (также #include)

g++ -c -E test.cpp

Есть результат:

# 2 "test.cpp" 2 

using namespace std; 

# 1 "square.h" 1 
# 1 "shapetwo.h" 1 
class ShapeTwoD 
{ 
public: 
virtual double computeArea(){return 2+3.0;}; 
}; 
# 2 "square.h" 2 

class Square:public ShapeTwoD 
{ 
public: 
virtual double computeArea(){return 2+4.0;}; 
}; 
# 6 "test.cpp" 2 

int main() { 
Square s; 
cout<<s.computeArea(); 
} 
+0

Работает для меня тоже - Я даже поставил рабочий код на код: http://codepad.org/p5PaiKHh – Arunas

+0

Я думаю, что это имеет какое-то отношение к тому, что я включаю только файлы заголовков разных классов – Computernerd

Смежные вопросы