2013-06-27 4 views
0

Я не могу точно описать, что я хочу сказать, но хочу использовать функции базового класса с унаследованным типом. Например, я хочу объявить «оператор Coord3D + (Coord3D)»; в одном классе, но если я использую его с операндами Vector3D, я хочу, чтобы он возвращал тип Vector3D вместо Coord3D.Вызов функций базового класса с унаследованным типом

С этой строкой кода, приведенной ниже, я добавляю два вектора Vector3D и получаю команду Coord3D в ответ, как мне рассказала функция typeid(). Name(). Как мне реорганизовать мои классы, чтобы я получил Vector3D по возвращении?

#include <iostream> 
#include <typeinfo> 
using namespace std; 

class Coord3D 
{ 
public: 
     float x, y, z; 
     Coord3D (float = 0.0f, float = 0.0f, float = 0.0f); 
     Coord3D operator + (Coord3D &); 
}; 

Coord3D::Coord3D (float a, float b, float c) 
{ 
     x = a; 
     y = b; 
     z = c; 
} 

Coord3D Coord3D::operator+ (Coord3D &param) 
{ 
     Coord3D temp; 
     temp.x = x + param.x; 
     temp.y = y + param.y; 
     temp.z = z + param.z; 
     return temp; 
} 

class Vector3D: public Coord3D 
{ 
public: 
     Vector3D (float a = 0.0f, float b = 0.0f, float c = 0.0f) 
     : Coord3D (a, b, c) {}; 
}; 

int main() 
{ 
     Vector3D a (3, 4, 5); 
     Vector3D b (6, 7, 8); 
     cout << typeid(a + b).name(); 
     return 0; 
} 
+0

что вы ожидаете произойдет здесь, и что вы хотите, чтобы произошло – aaronman

+0

я хочу Vector3Ds, чтобы иметь возможность добавлять друг друга, используя функции, полученные из Coord3D, но когда они добавляют, они превращаются в Coord3D вместо Vector3D. –

+0

Вы должны определить 'operator +' в 'Vector3D', который возвращает' Vector3D' вместо 'Coord3D'. –

ответ

1

Функциональность вы хотите в базовом классе, но она возвращает базовый класс (который имеет смысл, так как Coord3D понятия не имеет, что такое Vector3D есть). Если вы не согласны с тем, что не переписываете operator+() для Vector3D (что, я думаю, справедливо, если вы планируете умножить и так хорошо), вместо этого вы можете создать конструктор копирования в классе Vector3D, который может построить Vector3D из результата Coord3D.

class Vector3D: public Coord3D 
{ 
public: 
     Vector3D (float a = 0.0f, float b = 0.0f, float c = 0.0f) 
     : Coord3D (a, b, c) {}; 

     Vector3D (const Coord3D& param){ new ((Coord3D*)this) Coord3D(param); } 
}; 

int main() 
{ 
     Vector3D a (3, 4, 5); 
     Vector3D b (6, 7, 8); 
     Vector3D c = a + b; 
     cout << typeid(c).name(); 
     Sleep(1000); 
     return 0; 
} 
+0

Ум, разве это не значит, что «новый» собирается утешить память как сумасшедший? Хм, или это place_new, и все хорошо. –

+0

На самом деле это не выделяет больше места; конструктор уже создал небольшой маленький слот в памяти для объекта Vector3D, который выглядит как '[Coord3D Vector3D]'. В принципе, базовый класс объединяется с производным классом в памяти. С новым размещением мы говорим, что это приведет к тому, что «Coord3D» будет получен из добавления в базовый класс в слот '[Coord3D Vector3D]'. – Suedocode

+0

@Aggieboy Вы уверены? В куче теперь три поплавка, и они будут скопированы в стек; поэтому три поплавка на куче теперь свисают с указателями. Пожалуйста, поправьте меня, если я ошибаюсь. – rwols