2016-10-15 3 views
-1

私はunique_ptr <BaseClass>のベクトルに異なるサブクラスを格納しようとしています。このアプローチは、サブクラスが1つの深層であるが、サブクラスが深い2つの層である場合に失敗する場合に機能するように思われる。ベクトルに異なるサブクラスを格納する

は、ここで私は

#include <iostream> 
#include <memory> 
#include <vector> 

using namespace std; 

class A 
{ 
    int foo; 
public: 

    explicit A(int bar) 
    { 
     foo = bar; 
    } 

    int getFoo() 
    { 
     return foo; 
    } 

    virtual void func1() = 0; 
}; 

class B : public A 
{ 
public: 
    using A::A; 
}; 

class C : public A 
{ 
public: 
    virtual void func2() = 0; 
    using A::A; 
}; 

class D : public B 
{ 
public: 

    using B::B; 

    void func1() 
    { 
     cout << "D1" << endl; 
    } 
}; 

class E : public C 
{ 
public: 

    using C::C; 

    void func1() 
    { 
     cout << "E1" << endl; 
    } 
    void func2() 
    { 
     cout << "E2" << endl; 
    } 

}; 

int main() 
{ 
    vector<unique_ptr<A> > vec; 
    vec.emplace_back(new D(1)); 
    vec.emplace_back(new E(2)); 
    vec[0]->func1(); // Okay 
    vec[1]->func1(); // Okay 
    vec[1]->func2(); // error: 'class A' has no member named 'func2' 
    E foo(3); 
    foo.func2(); // Okay 

    return 0; 
} 

答えて

0

クラスAへのポインタしか格納していないので、オーバーロードされているとfunc1を呼び出すことができます。

しかし、func2はクラスAの内部に存在しないので、ポインタがfunc2を持つクラスCへのポインタであっても、クラスAへのポインタとして扱うので、func2を呼び出すことはできません。 func2 doestは、クラスAの文脈では何も意味しません。

0

あなたは多型がどのように機能するかを見なければならないがやろうとしているものです:あなたがAの上にポインタを持っている場合にのみ、そのメソッドのいずれかを呼び出すことができます。あなたのサンプルでは、​​A :: func2()には意味がありません。

0

は多型では、あなたはあなたが実際に指しているクラスで、後に使用しようとしているすべてのメソッドを実装する必要があります。

class A 
{ 
public: 
    virtual void func(); 
    virtual void func2(); 
} 

class B : public A 
{ 
public: 
    void func(); 
} 
class C : public A 
{ 
public: 
    void func2() 
} 

同じ変数のために行きます。今では、Aのfunc2を呼び出すつもりなら、文字通り何も起こりません。あなたがリターン型を持っているなら、より巧妙な解決策を探す必要があります。

0

問題は、ポインタの格納方法とは関係ありません。問題は単にAには方法がないということですfunc2

A* p = new E(2); 
    p->func2(); 

も失敗します。

func2をAに追加するか、pをEポインタにキャストする必要があります。

関連する問題