如何通过c ++中的父类访问派生类的元素?

时间:2013-05-17 21:14:13

标签: c++ class

class game_list
{
    public:
        string name;
        float price;
        string platform;
        string console;
        string conditin;
        bool is_portable;

};

class catridgeClass:public game_list
{
    string N_bits;
    bool is_import;
};

动态创建游戏列表,名为mainPointer的指针指向该动态对象。但我对如何通过父类cartridgeClass访问game_list个元素感到困惑。我已经尝试mainPointer->N_bits了。好像它不会这样工作?对不起,我只是c ++的菜鸟。

4 个答案:

答案 0 :(得分:2)

要访问catridgeClass属性,您需要一个catridgeClass对象。

首先,您需要更正您的班级以获得公共属性。

class catridgeClass:public game_list
{
   public:
    string N_bits;
    bool is_import;
};

class anotherClass: public game_list
{
   public:
      string other_member;
};

您需要从调用函数中获取catridgeClass对象:

int main()
{
   std::vector<game_list *> games;

   games.push_back(new catridgeClass);
   games.push_back(new anotherClass);

   for(int i=0; i<games.size(); i++)
   {
      //You will need to get a catridgeClass object to access it's members.
      catridgeClass *catridge_ptr = dynamic_cast<catridgeClass *>(games[i]); 

      //Or to access anotherClass.
      anotherClass *another_ptr = dynamic_cast<anotherClass*>(games[i]);

      //If the conversion is not possible, dynamic_cast will return a null pointer
      if(catridgeClass != NULL)
        std::cout << catridge->N_bits << std::endln;
      if(anotherClass  != NULL)
        std::cout << anotherClass->other_member << std::endln;
   }

   //And of course, you need to avoid a memory leak
   for(int i=0; i<games.size(); i++)
      delete games[i]

   return 0;
}

请记住,这不是理想的设计。如果你试图使用polimorphism,那是因为所有类都有共同的行为。更好的方法是使用interfaces

答案 1 :(得分:1)

在父类中尝试虚拟方法getNBits() = 0;,并在子类中定义它。

请参阅:C++ Virtual/Pure Virtual Explained

答案 2 :(得分:1)

父类没有关于其子类的信息。做你想做的事的唯一方法就是像Dory建议的那样 - 我经常皱眉 - 或者在子类重新定义的父类中创建一个虚函数。

为什么我对演员皱眉?大多数情况下,动态转换对象以从中获取数据代表了编写糟糕的代码。我不确定代码的其余部分是什么样的,但我的猜测是有更好的方法通过共享功能来编写代码。例如,假设您要使用这些项目的是显示字符串信息。在这种情况下,编写它的最佳方法是使用虚函数:

class game_list
{
    public:
        string name;
        float price;
        string platform;
        string console;
        string conditin;
        bool is_portable;
        public virtual void PrintInfo() 
        { 
            cout << "name: " << name << ", price: " << price; //etc
        } 

};

class catridgeClass:public game_list
{
    string N_bits;
    bool is_import;
    public virtual void PrintInfo()
    {
        game_list::PrintInfo();
        cout << ", bits: " << bits << ", is import: " << is_import;
    }
};

现在调用mainPointer-&gt; PrintInfo()将打印正确的信息,无论其基础类型如何。更好,这是“面向对象的方式。”

答案 3 :(得分:0)

尝试使用dynamic_cast

catridgeClassPtr = dynamic_cast<catridgeClass*>(GameListPtr);

catridgeClassPtr->N_bits;

有关dynamic_cast的完整信息: http://www.cplusplus.com/doc/tutorial/typecasting/