2012-10-31 3 views
0

두 클래스 ClassA와 ClassB가 있다고 가정 해보십시오.하나의 함수 인수에 대해 여러 클래스를 허용하려면 어떻게합니까?

ClassB는 ClassA를 상속하며 일부 추가 기능과 변수가 있습니다.

ClassA 또는 ClassB를 동일한 인수로 받아 들일 수있는 함수를 만들 수 있습니까? 그리고 어느 것이 사용되었는지 결정하게 할 수 있습니까?

+1

다형성 및 실시간 유형 정보 (RTTI)를 사용할 수 있습니다. – imreal

+1

그래, 몇 가지 다른 방법으로,하지만 내 즉각적인 생각 wasjust 과부하 기능을 누른 다음 그것에 대해 걱정할 필요가 없습니다. –

+0

함수가하는 일에 대해 자세히 설명해 주시겠습니까? –

답변

2

예, 참조에 의해 매개 변수를 취할 수 있습니다

void foo(ClassA& x) //or const ClassA 

당신은 ClassA 또는 ClassB의 두 인스턴스를 전달할 수 있어야하고, 실제로 함수 내부에 입력을 결정하는 RTTI를 사용합니다.

또는 ClassA에 대한 포인터를 전달할 수 있지만 가능한 경우 참조를 선호합니다.

2

ClassA 인스턴스에 대한 포인터 또는 참조로 함수 매개 변수를 선언하십시오. 값으로 전달하지 마십시오. 그렇지 않으면 입력 인스턴스가 런타임에 분리됩니다. 그런 다음 ClassB 특정 기능에 액세스해야하는 경우 dynamic_cast을 사용할 수 있습니다. 예 :

class ClassA 
{ 
public: 
    int a; 

    virtual ~ClassA() {} 
    void DoSomething(); 
}; 

class ClassB : public ClassA 
{ 
public: 
    int b; 
    void DoSomethingElse(); 
}; 

void func(ClassA *obj) 
{ 
    int a = obj->a; 
    obj->DoSomething(); 

    ClassB *objB = dynamic_cast<ClassB*>(obj); 
    if (objB) 
    { 
     int b = objB->b; 
     objB->DoSomethingElse(); 
    } 
} 

int main() 
{ 
    ClassA a; 
    func(&a); 

    ClassB b; 
    func(&b); 

    return 0; 
} 
0

여기에는 간접적 인 설명이 있습니다. Consumer::accept 함수는 A 유형의 객체와 B 유형을 모두 허용하며 특정 동작은 고객이 아닌 클래스로 구현됩니다.

struct Consumer; 

struct A 
{ 
    virtual ~A() { } 
    virtual int use(Consumer &); 
}; 

struct B : A 
{ 
    virtual int use(Consumer &); 
}; 

struct Consumer 
{ 
    void accept(A & x) 
    { 
     int n = x.use(*this); 
     do_more_stuff(n); 
    } 

    void do_more_stuff(int); 

    // ... 
}; 
관련 문제