0

基本クラスUnix_tree、派生クラスなどがUnix_tree_type1あるとUnix_tree_type2します。にキャストできないのはなぜUnix_treeですかUnix_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

意味がないため、基本クラスを派生クラスにキャストする方法はありません。OO の詳細についてはあまり説明しませんが、基底クラスから継承する目的は、単に「基底クラスに含まれるデータを出力する」ことではなく、より具体的な機能の実装を提供することです。「GetJuice()」メソッドを持つ「Fruit」クラスを想像してみてください。「Fruit」から継承するクラス「Apple」は、メソッド「GetJuice()」を継承する可能性があります。ただし、そのメソッドに加えて、「FindAppleWorm()」など、そのタイプに固有の他のメソッドまたはプロパティを定義できます。したがって、Apple クラスがある場合は、それをフルーツ型にキャストできますが、Fruit クラスの「GetJuice()」メソッドを呼び出すことは理にかなっています。でも、

オブジェクト指向言語の継承の概念は、ポリモーフィズムの概念を補完します。良い紹介を得るためにウィキペディアの記事をお勧めします。

于 2012-08-22T20:26:53.560 に答える
1

キャストできますが、キャストしないでください。基本クラスが指すオブジェクトのメンバー関数を呼び出すだけで、実装が呼び出されます。それが仮想メンバー関数のポイントです。

于 2012-08-22T20:18:05.023 に答える
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 に答える