2014-06-06 4 views
0

처음에는 사과하는 질문이지만이 글에서는 초보자 인 경우 사과드립니다. 내 질문은 내가 믿는 다이아몬드 문제의 변형입니다.다중 상속 클래스의 가상 함수

나는 다음과 같은 수업을 상상해 :

class A{ public: virtual foo();}; 

class B{ public: foo();}; 

class C{ public: foo();}; 

class D: public A, public B, public C{ 
    public: foo(); 
}; 

내 질문은이 클래스 D에서 foo()를 호출하고 가상 함수가 A, B, CD를 통해 실행하는 것이 가능하다. 나는 이것을 시도했지만 d::foo() 함수는 다른 모든 foo() 함수보다 우선합니다.

1 : 2 상속 체계를 만든 경우에만 가능합니까?

class A{ public: virtual foo();}; 

class B: public A { public: foo();}; 

class C: public B { public: foo();}; 

class D: public C { public: foo();}; 

물어 이유는 내가 가상 함수를 실행의 가능성을 각 시간 A 또는 B 또는 C를 구성 할 필요없이 다른 클래스에 A, BC을 구성하지만, 유지할 수 있도록하고 싶습니다 때문이다 각 경우에 전화 할 필요없이 A::foo(), B::foo(), C::foo().

+0

"제 질문은 클래스 D에서 foo()를 호출하고 A, B, C 및 D에서 가상 함수를 실행할 수 있다는 것입니다."무엇을 의미합니까? – Brian

+0

D.foo()를 호출하고 A.foo(), B.foo() 및 C.foo()를 동시에 호출하도록 요청합니까? – bstar55

+0

예 bstar55. 나는 동시에 그들 모두에게 전화하고 싶다. 따라서 D.foo()를 호출하면 A.foo(), B.foo(), C.foo() 및 D.foo()가 호출됩니다. 시도하고 덜 혼란스럽게 질문을 변경했습니다. – hadroque

답변

0

이것은 기능 과부하으로, 자동으로 원하는 것을 수행 할 수 없습니다.

이처럼해야 할 :

has virtual method..but not virtual constructor

보통 경고가 될 것이 현명하다 : 당신은 아마받을 수 있기 때문에

#include <iostream> 

class A { 
public: 
    virtual void foo() { 
    std::cout << "foo of A\n"; 
    } 
}; 

class B { 
public: 
    // virtual keyword is not needed, 
    // but it's to write it so that you 
    // remind the reader that foo is virtual 
    virtual void foo() { 
    std::cout << "foo of B\n"; 
    } 
}; 

class C { 
public: 
    virtual void foo() { 
    std::cout << "foo of C\n"; 
    } 
}; 

class D : public A, public B, public C { 
public: 
    virtual void foo() { 
    A::foo(); 
    B::foo(); 
    C::foo(); 
    std::cout << "foo of D\n"; 
    } 
}; 

int main() 
{ 
    D d_object; 
    d_object.foo(); 
    return 0; 
} 

그러나, 나는 강력하게,이 answer 읽기 제안 이들은 보통 논리적 오류를 노출하기 때문에 실제 오류처럼 취급됩니다.

+0

포인터를 가져 주셔서 감사합니다. 이 예제를 올바르게 이해하면 가상 함수를 선언하지 않고도이 예제를 구성 할 수 있습니까? 함수 foo()를 오버로딩하면됩니다. – hadroque

+0

@hadroque true. 그러나'virtual' 키워드를 삭제하고 알아낼 수 있습니다. 왜 이런 일이 일어 났는지 이해하시기 바랍니다. 천만에요. – gsamaras

+0

그런데 질문에 -1이 너무 초보자에게는 너무 많아서 @hadroque의 균형을 맞추기 위해 투표를하고 있다고 생각합니다. :) – gsamaras

0

클래스 D::foo을 구현해야하는데, A::foo(), B::foo()C::foo()을 명시 적으로 호출해야합니다. 각 부모 클래스에 자동으로 foo()을 호출하는 방법은 없습니다.