【发布时间】:2015-09-07 11:04:48
【问题描述】:
我有以下类和 typedef:
class Object
{
protected:
long int id;
public:
Object(void);
~Object(void) {};
long int get_id(void);
};
typedef map<string, Object> obj_map;
然后我有了它的孩子:
class Image: public Object
{
private:
path full_path;
int x;
int y;
img image;
public:
Image(path p, int x_pos = 0, int y_pos = 0);
~Image(void) {};
void draw(int flags = 0);
void move_north(float velocity);
void move_south(float velocity);
void move_west(float velocity);
void move_east(float velocity);
path get_path(void);
img get_image(void);
int get_x(void);
int get_y(void);
void set_path(path p);
void set_image(img _image);
void set_x(int value);
void set_y(int value);
};
每个对象都存储在这个静态映射 obj_map 中,在一个名为 App 的类中。所以让我们假设我们在键 foo 下有一个对象。我们可以这样打印它的 id:
cout << App::objects.find("foo")->second.get_id() << endl;
现在,假设我已将一个 Image 对象作为值传递给该地图。当我尝试访问它时,我可以正常访问该 id。但是,当我尝试访问 Image 方法时:
cout << App::objects.find("foo")->second.get_x() << endl;
我得到一个:
error: 'class Object' has no member named 'get_x'
那是因为 Object 类实际上没有它。所以,我尝试投射它:
cout << static_cast<Image>(App::objects.find("foo")->second).get_x() << endl;
我明白了:
error: no matching function for call to 'Image::Image(Object&)'
如果我尝试使用 dynamic_cast,我会得到一些可怕的东西......
error: cannot dynamic_cast 'App::objects.std::map<_Key, _Tp, _Compare, _Alloc>::find<std::basic_string<char>, Object, std::less<std::basic_string<char> >, std::allocator<std::pair<const std::basic_string<char>, Object> > >((* & std::basic_string<char>(((const char*)"foo"), (*(const std::allocator<char>*)(& std::allocator<char>()))))).std::_Rb_tree_iterator<_Tp>::operator-><std::pair<const std::basic_string<char>, Object> >()->std::pair<const std::basic_string<char>, Object>::second' (of type 'class Object'
我不明白。构造函数不是继承的。构造函数与它无关。 Image 对象具有完全不同的构造函数,但 它是 一个对象。关键是:我无法创建图像映射,因为最终我的引擎中将有许多对象,并且我希望能够从超类中访问它们。
【问题讨论】:
-
您的错误是有充分理由的,因为
Object类没有成员函数get_x()。继承是一种方式,母亲继承给孩子,而不是相反。 -
您的地图是使用对象,而不是对象指针。除非使用指针,否则无法获得多态行为。
标签: c++ inheritance constructor subclass superclass