2016-10-15 1 views
-1

unique_ptr <BaseClass> 벡터에 다른 하위 클래스를 저장하려고합니다. 이 접근법은 하위 클래스가 한 계층 깊이이지만 하위 클래스가 두 계층 인 경우 실패합니다.벡터에 다른 하위 클래스 저장

는 여기에 내가

#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 :: 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 포인터에 캐스트해야합니다.

관련 문제