使用不同对象的矢量

时间:2014-07-12 21:46:49

标签: c++ object vector

我试图创建一个具有不同变量的对象向量,可以找到如何访问不在基类中的变量。

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);
 }

1 个答案:

答案 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.

无论指针是否在向量中,这些转换都将起作用。