我试图创建一个具有不同变量的对象向量,可以找到如何访问不在基类中的变量。
struct X {
string name;
};
struct Y : X {
int num;
void Set_Num(int a)
{
num = a;
}
};
int main()
{
vector<X*> v;
v.push_back(new Y);
v[0]->name="It"; //I can access name but not num
// v[0]->Set_Num(10);
}
答案 0 :(得分:3)
是的,你可以,但有一些事情需要考虑。
在C ++中,您可以使用static_cast,dynamic_cast或reinterpret_cast来完成此操作。
static_cast
将允许您将指针强制转换为派生指针,但是您有责任确保强制转换为有效。如果不是,您将得到未定义的结果。有关完整规则,请参阅here
dynamic_cast
函数只允许有效的强制转换,如果在指向的对象不是派生的子类时尝试将基指针强制转换为派生指针,则返回nullptr
。使用dynamic_cast启用RTTI(RunTime-Type Identification)并将更多代码注入二进制文件。 (即,它有成本。)有关完整规则,请参阅here
reinterpret_cast
甚至比static_cast更自由,并且允许你编译甚至疯狂的事情,比如将int *转换为std :: string *或者你最喜欢的任何东西。 (有一些事情是不会做的,但对于指针来说,它主要是免费游戏)。有关完整规则,请参阅here
X* reallyY = new Y();
Y* y1 = static_cast<Y*>(reallyY); // Ok
Y* y2 = dynamic_cast<Y*>(reallyY); // Ok
Y* y3 = reinterpret_cast<Y*>(reallyY); // Ok
X* reallyX = new X();
Y* y4 = static_cast<Y*>(reallyX); // Undefined
Y* y5 = dynamic_cast<Y*>(reallyX); // nullptr
Y* y6 = reinterpret_cast<Y*>(reallyX); // Undefined
int *intp = reinterpret_cast<int*>(reallyY); // Ok, reinterpret_cast may do this
Y* y7 = static_cast<Y*>(intp); // Error, but not static cast.
Y* y8 = dynamic_cast<Y*>(intp); // Error, Dynamic cast will also complain.
Y* y9 = reinterpret_cast<Y*>(intp); // Ok, reinterpret allows conversion back.
std::uintptr_t anInteger = reinterpret_cast<std::uintptr_t>(reallyY); // OK.
无论指针是否在向量中,这些转换都将起作用。