我在 C++ 中遇到问题。我希望采用派生类,将其与其他一些基类一起作为其基类。然后对所有只要求它们是基类的类执行一些操作。在此之后,我希望再次返回类的派生部分。
我试图尽可能简化问题并生成一个测试程序,如下所示
#include <vector> //Needed for the holding class and main
#include <iostream> //For output to terminal
class Base
{
int a; //Variable for all classes derived from base
public:
Base() { a = 13; }; //Set a to something
int get_a() { return a; }; //Access a
virtual void bugger_all() {}; //To make the class polymorphic (my first alarm that I might be doing something wrong with polymorphism
};
class Derived:public Base
{
int b;//not accessable by the base class
public:
Derived():Base() { b = 7; };//Set b and a to something
int get_b() { return b; };
void bugger_all() {}; //Implements to virtual function from the base class (just to make everything polymorphic)
};
//Holds several bases
class Holder
{
std::vector<Base> bases;//Holds a vector of base classes, not nessesarily derived classes but can be
public:
void add(Base to_add) { bases.push_back(to_add); };//Add something to the vector
Base get(int i) { return bases[i]; };//Get a certain vector
void print_all() { for(unsigned int i=0; i<bases.size(); i++) std::cout << bases[i].get_a() << "\n"; }; //Prints a for all bases, note that this is specific only to bases and can also be used for derived classes
std::vector<Base> get_all() { return bases; };//Returns the main vector
};
int main(int argc, char *argv[])
{
Derived higher = Derived(); //The derived class (extends the base class)
Base lower = Base(); //Simply a base class, for comparisons
Holder holding_class = Holder();//Will hold both the above objects
//Add the objects to the holder
holding_class.add(lower);
holding_class.add(higher);
//Prints everything in the holder
holding_class.print_all();
std::vector<Base> all_bases = holding_class.get_all(); //Get all the bases back again
std::cout << all_bases[1].get_a() << "\n"; //Test to see if we have retained a from the derived class
Derived higher_again = *(static_cast<Derived*>(&all_bases[1])); //Cast is done here, take a base class and change it to a derived class
std::cout << higher_again.get_b() << "\n"; //Output something specific to the derived class
return 0;//Exit
}
它使用 g++ 编译,没有错误。程序运行,输出为
13
13
13
0
如果程序按预期工作,我希望输出是
13
13
13
7
这向我表明'higher_again'被错误地转换并且它的'b'值以某种方式丢失并且编译器只是将该值设置为0。
环顾四周,似乎不建议使用 dynamic_cast 和 static_cast (可能是因为这样的问题)。但是,我看不到解决该问题的方法。我也意识到我可能在多态性方面做错了(必须创建一个无用的虚函数)。任何意见将是有益的。提前致谢。