0

假设您有基类Unix_tree和派生类,Unix_tree_type1依此Unix_tree_type2类推。为什么我不能投射Unix_treeUnix_tree_type...?有没有办法进行这样的演员表?派生类包含抽象方法的实现,它们的目标是以不同的方式打印基类中包含的数据。谢谢。

class Unix_tree
    {
    public:
        Unix_tree () 
        {
            tree_it.tree = &tree;
        }

        Unix_tree(const Unix_tree& utree) : num_of_files(utree.num_of_files), tree(utree.tree), tree_it(utree.tree_it) 
        {
            tree_it.tree = &tree;
        };

        int num_of_files;
        map<int, pair<int, string> > names;
        vector<pair<int, int> > edges;

        Tree< pair<int, string> > tree;
        TreeIterator< pair<int, string> > tree_it;

        string input_format;
        string output_format;

        static Unix_tree* load_tree(istream& input_info);
        void load_names(istream& input_info);
        void load_tree_nodes(vector<int>& levels);
        Unix_tree* convert(string format);

        virtual void load(istream& input_info) = 0;
        virtual void print_function(const Tree<pair<int, string> >* node, const vector<bool>& visited ) = 0;
        void print_tree();
    };


    class Unix_tree_type1 : public Unix_tree
    {
    public:

        void load(istream& input_info);
        void print_function(const Tree<pair<int, string> >* node, const vector<bool>& visited);
    };
4

4 回答 4

1

您可以转换指针,因此:

Unix_tree *p = ...;
Unix_tree_type1 *q = (Unix_tree_type1*)p;

但我不认为你想这样做。方法调用会自动执行您想要的操作,因此:

Unix_tree *p = ...; // points to an instance of Unix_tree_type1
p->load(...);       // calls Unix_tree_type1::load, not Unix_tree::load
于 2012-08-22T20:17:03.943 回答
1

你可以施放,但你不应该。您应该只调用基类指向的对象的成员函数,然后您的实现将被调用。这就是虚成员函数的意义所在。

于 2012-08-22T20:18:05.023 回答
1

没有办法将基类转换为派生类,因为它没有意义。无需过多介绍 OO 细节,从基类继承的目的不仅仅是“打印基类中包含的数据”——而是提供更具体的功能实现。所以想象一个“水果”类,它有方法“GetJuice()”。继承自“Fruit”的类“Apple”可能会继承方法“GetJuice()”。但是,除了该方法之外,它还可以定义特定于其类型的其他方法或属性,例如“FindAppleWorm()”。因此,当您有一个 Apple 类时,您可以将其转换为类型 fruit,调用 Fruit 类的“GetJuice()”方法仍然有意义。然而,

面向对象语言中的继承概念补充了多态性的概念。我会推荐维基百科文章以获得很好的介绍。

于 2012-08-22T20:26:53.560 回答
0

你为什么不能?当然可以 - 这是有效的向上转换,可以通过dynamic_cast. 但是你应该转换指针或引用,而不是类型本身。

Unix_tree_type1* ptree1 = ...; // Some pointer initialization
Unix_tree* ptree2 = dynamic_cast<Unix_tree*>(ptree1);// Safe
Unix_tree* ptree3 = static_cast<Unix_tree*>(ptree1); // Also safe
于 2012-08-22T20:21:12.577 回答