1
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通过父类访问 s 元素感到困惑game_list。我已经试过了mainPointer->N_bits。好像不是这样工作的?对不起,我只是 C++ 的菜鸟。

4

4 回答 4

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

请记住,这不是理想的设计。如果您尝试使用多态,是因为所有这些类都有共同的行为。更好的方法是使用接口

于 2013-05-17T21:18:21.793 回答
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->PrintInfo() 将打印正确的信息,而不管其基础类型如何。更好,它是“面向对象的方式”。

于 2013-05-17T21:39:01.607 回答
1

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

请参阅:C++ 虚拟/纯虚拟解释

于 2013-05-17T21:19:11.007 回答
0

尝试使用 dynamic_cast

catridgeClassPtr = dynamic_cast<catridgeClass*>(GameListPtr);

catridgeClassPtr->N_bits;

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

于 2013-05-17T21:17:14.103 回答