2012-05-03 2 views
0

내 그룹은 간단하다 다음과 같은 구조추상적 인 파생 클래스

class Base 
{ 
public: 
    float some_base_function(); 
}; 

class Derived : public Base 
{ 
public: 
    float some_other_function(); 
    float yet_another_function(); 
}; 

와 코드가 있습니다. 문제는 현재 약간의 실험적인 방법으로 Derived을 다시 구현할 생각입니다.

class IDerived : public Base 
{ 
public: 
    virtual float some_other_function() = 0; 
    virtual float yet_another_function() = 0; 
}; 

그리고 IDerived에서 상속 할 Derived 이전을 변경 : 내 생각은이 작업을 수행하는 것이 었습니다. 이 종류의 Concrete -> Abstract -> Concrete Inheritance 구조가 C++에서도 허용 되는가?

더 나쁜 것은 원래 Derived 클래스가 프레임 워크 내에서 지속되므로 메모리에서 동일한 구조를 유지해야한다는 것입니다. (이는 IDerived 추상화를 통해 달성하기를 바랬습니다). 새로운 Derived의 메모리 레이아웃이 같습니까?

+0

마지막 단락은 매우 걱정됩니다. 나는 잘 작동하도록 설계된 C++ 프레임 워크를 상상할 수 없다는 것을 알게되었습니다. 프레임 워크를 올바르게 사용하고 있습니까? – Mankarse

+0

당신은 이것으로부터 어떤 이점을 얻습니까? – Pubby

+0

@Mankarse, 프레임 워크는 잘 설계되지 않았기 때문에 그런 이상한 질문을하고 있습니다. 그러나 그러한 삶은 때로는 프레임 워크가 그들이 무엇을하고 있는지 모르는 사람들에 의해 설계되었습니다. – Shep

답변

2

그것은 합법적이지만, 필요하지는 않습니다. 여분의 상속의 핵심은 무엇입니까?

또한 BaseDerived에는 가상 메서드가 없으므로 99 %를 추가하면 메모리 레이아웃이 동일하지 않을 수 있습니다.

+0

'파생'을 다시 작성하는 중이지만 몇 군데에서 생성됩니다 다른'Base' 객체를 가진 컨테이너에 저장됩니다. 'Derived' 객체 중 일부를 대체 할 수 있지만 모든 객체를 대체 할 수 있기를 희망합니다. – Shep

+0

'Derived '의 메모리 레이아웃은'Base'가 전에 가상 메소드 나 상속을 가지고 있지 않다면 확실히 바뀔 것입니다. – Useless

+0

@Useless에서 표준을 인용 할 수 있습니까? –

1

예, 허용됩니다. 그러나 일반적인 연습은 어떤 종류의 구체적인 기본 클래스 (예 : Scott Meyers의 Item 33, More Effective C++ 참조)를 피하는 것입니다.

이진 표현을 저장하여 복잡한 객체를 유지하려고하면 모든 문제가 발생합니다. 더 나은 메커니즘 (직렬화 등)을 찾는 것이 좋습니다.

+0

확실하지만 이것은 곧 변경되지 않는 그룹 프레임 워크이므로 불행히도 콘크리트 기초 클래스로 작업해야합니다 – Shep