2014-03-06 1 views
0

나는 다음과 같은 별자리가 있습니다C++ 멤버 배열 초기화되지

derived* instance = new derived(); 

하지만 수행하여 :

base* instance = new derived(); 

_B는이 0x0를 유지를

class base {...}; 

class derived : public base 
{ 
public: 
    unsigned int* a; 

    derived(size_t num = 1) : a(0), _b(0) 
    { 
    a = new unsigned int[num]; 
    _b = new unsigned char[num]; 
    } 
private: 
    unsigned char* _b; 
} 

모든이를 수행하여 괜찮습니다 나중에 _b를 사용하려고하면 오류가 발생합니다.

여기 무슨 일입니까?

업데이트 :이 문제는 윈도우/리눅스 크로스 플랫폼 문제로 인해 발생 된

- 값이 잘못된 포인터로 가득했다.

+8

테스트 케이스 게시 또는 문제가 발생하지 않았습니다. – juanchopanza

+1

그건 너무 이상해서 믿기 어렵습니다. [SSCCE] (http://sscce.org/)를 게시 할 수 있습니까? 이상적으로 예를 들어 붙여 넣기 만하면됩니다. [ideone] (http://ideone.com/) 그리고 그것을 직접보십시오. – Angew

+0

기본 클래스에 이름이 _b 인 데이터 멤버가 있습니까? 기본 클래스 정의를 표시해야합니다. –

답변

2

첫째 :

는 왜 두 번 ab를 초기화해야합니까? 명시 적 초기화 만 사용하거나 표준 멤버 초기화는 둘 다 사용하면 안됩니다.

derived(size_t num = 1) : a(new unsigned int[num]), 
          _b(new unsigned char[num]) 
{ 
} 

트릭을 수행해야합니다.

두 번째 : derived의 인스턴스를 base에 만들면 파생 된 모든 멤버와 함수가 쓸모 없게됩니다. 기본 클래스의 멤버와 함수는 제외하고 두 클래스 모두에서 공통적입니다.

+1

** 처음 ** : 질문에 대답하지 않습니다. ** 두 번째 ** : * "파생 된 모든 구성원과 함수는 쓸모가 없습니다. 두 클래스 모두에서 공통적 인 기본 멤버 및 함수를 제외하고"* - 가상 함수에 대해 들어 보셨습니까? – SomeWittyUsername

+0

예, 질문에 대답하는 것을 잊었습니다. 가상 기능에 대해서도 들었습니다. 그리고 나는 내 대답에서 그들을 잊어 버린다. 내 잘못. :) –

관련 문제