我有一些看起来像这样的Object结构:
struct Object {
string type;
Color c;
float ambient, diffuse;
};
struct Sphere: Object {
Point center;
float radius;
};
struct Square: Object {
Point loc;
float len;
};
我有一个充满球体和方形结构的向量:
vector<Object> objs;
Sphere sp = //sphere stuff
Square sq = //square stuff
objs.push_back(sp);
objs.push_back(sq);
我可以很好地访问父结构中的值,但是我无法弄清楚如何访问Sphere和Square结构中的值。这就是我现在正在做的事情:
cout << objs.at(i).type << endl; //This works
cout << objs.at(i).center.x << endl; //Not working
有谁知道怎么做?
答案 0 :(得分:1)
你不能,他们不再存在。您没有在Square
中存储Sphere
或vector
,而只是存储Object
。你应该阅读What is object slicing?。
也就是说,如果您将指针存储到Object
,std::vector<Object*>
,则可以将指针传递给派生类型的对象。但是,您如何知道vector
中的哪个元素是Square
,哪个元素是Sphere
。拥有基类的唯一目的是通过virtual
函数为所需的功能提供接口,派生类实现不同的功能方法:
struct Base {
virtual void foo() { std::cout << "foo in base\n"; }
};
struct Derived1 : Base {
void foo() override { std::cout << "foo in Derived1\n"; }
};
struct Derived2 : Base {
void foo() override { std::cout << "foo in Derived2\n"; }
};
Derived2 d;
Base* b = &d;
b->foo(); // prints "foo in Derived2\n"
也就是说,要从Square*
获得Object*
,如果您确定static_cast<Square*>(objP)
,则使用Square
,如果您确定dynamic_cast<Square*>(objP)
,则使用import android.support.v4.app.FragmentManager;
不确定(如果你错了,它会返回一个空指针)。 必须这样做可能表明设计不好!
此外,请重新考虑您对通常被视为不良做法的使用:using namespace std;
和endl
(这些是解释的链接)。