2014-11-20 1 views
3

아래 두 개의 간단한 클래스가 있습니다. 하나는 기본 클래스이고 다른 하나는 기본 클래스입니다.
파생 클래스에는 기본 및 파생에 필요한 모든 인수를 사용하는 생성자와 기본 클래스 참조 자체를 인수로 사용하는 생성자가 있습니다.기본 클래스를 인수로 취한 파생 클래스 생성자 (좋은 연습인가요?)

인자로 기본 클래스 참조를 취하는 생성자는 좋은 습관이 아닙니다.
그러나 좋은 연습으로 간주되지 않는 이유는 무엇입니까? 다른 생성자와 동일한 작업을 수행합니다.

누군가가 왜 좋은 OOP 실천이 아닌지 명확히 할 수 있습니까?

class Base 
{ 
public: 
    Base(int a, int b): 
     m_a(a), 
     m_b(b) 
    {} 

    Base(const Base& b): 
     m_a(b.m_a), 
     m_b(b.m_b) 
    {} 

    ~Base() {} 

protected: 
    int m_a; 
    int m_b; 
}; 

class Derived : public Base 
{ 
public: 
    // Constructor which takes base class argument and initializes base 
    Derived(Base &base, int c): 
     Base(base), 
     m_c(c) 
    {} 


    Derived(int a, int b, int c): 
     Base(a, b), 
     m_c(c) 
    {} 

    ~Derived() {} 

private: 
    int m_c; 
}; 

int main() 
{ 
    Base base(1,2); 
    Derived derived1(base, 3); // 
    Derived derived2(1,2, 3); 
} 
+0

당신은 이것이 좋은 습관이 아니라는 것을 어디에서 발견 했습니까? – nitish005

+0

나는 그것이 주로 당신의 디자인에 달려 있다고 생각합니다. ''Derived''가''Base'' 나 래퍼의 확장 인 경우, 왜 안됩니다! 하지만 구현시 문제가 발생할 수 있습니다. 주로 포인터를 사용하고 매번 복사하지 않을 경우 (주의 깊게''Base''를 구현해야합니다). ''Derived''를''Base''에서 독립적 인 것으로 생각하거나 구현을 감추고 싶다면 그렇게 좋은 습관이 아닐 것입니다. – NikolayKondratyev

답변

0

첫 번째 Derived 생성자를 지정하는 컨텍스트를 알아야합니다.

그러나 const Base 매개 변수를 사용하여 정의하는 것이 더 멋지겠습니까? 같은 뭔가 :

Derived(const Base &base, int c): 
     Base(base), 
     m_c(c) 
    {} 

는 따라서, base 개체의 상태를 보호하는 컴파일러를 알려줍니다. 당신은 C++ 사용하는 경우

또한, 11 -, 당신은 선언에 관심이있을 수 있습니다 DerivedBase의 생성자를 상속하게 무엇 Derived 클래스 내부

using Base::Base; 

. 따라서 추가 할 수 있습니다. main() :

Derived derived3(1,2); 

완벽하게 컴파일됩니다.

C++ - 11에서는 m_c 데이터 멤버의 기본값을 설정할 수도 있습니다. 예를

int m_c = 0; 

그래서 Base로부터 상속 생성자가 일관성있는 상태

+0

나는 당신이 말하는 것을 이해하지만 그것이 내가 찾고 있었던 것이 아닙니다. 거의 모든 C++ 자습서 또는 서적은 파생 클래스가 기본 매개 변수를 모두 가져 와서 기본 멤버를 초기화하도록 지정합니다. 파생 클래스가 Base를 매개 변수로 사용하지 않아야하는 이유는 무엇입니까 /해야하지 않을까요? – Rush

0

Derived을 떠날 것이다 위해 당신이 보여 코드가 하지 나쁜 OOP 연습 믿습니다. Derived의 사용자는 이 (를) 공중 상거래를 사용하고 있다는 사실을 알고있어 Base에 대해 알아 이 때문에 종속성을 추가하지 않으므로 더 제한적이거나 복잡한 것은 없습니다. Derived 보호 또는 개인 상속을 사용하는 경우에도 말했다

는 반드시 Derived의 사용자가 다른 클래스 Base에 대해 알고 것인지 여부에 따라 나쁜 연습을하지 않을 수 있습니다.

이 상상 :

class Derived { // no inheritance 
public: 
    void doSomething(const X& b); // `X` could be `Base`, `Foo`, or `std::string` for that matter... 
}; 

당신은 위의 나쁜 관행을 부를 것이다? 나는 그렇게 생각하지 않는다. 여기서 제시 한 코드 에서처럼, lrleon이 제안하는대로 & Base에 const 한정자를 추가했다고 가정 할 때 Base을 값 유형으로 사용한다는 것이 핵심입니다.Derived은 전달되는 기본 객체에 대한 포인터/참조를 보유하지 않으므로 정상적인 매개 변수 전달이 있으며 매개 변수 전달에 대한 비정상적이거나 나쁜 관행은 없습니다.

+0

이제 여분의 복사본으로 인해 효율적인 * 코드가 아니라고 주장 할 수 있습니다.하지만 그것은 다른 질문입니다. –

관련 문제