2017-12-05 11 views
-2

나는 이런 식으로 뭔가를 시도 : 그래서, 수업 자료 상속 객체 A를 보유하고 C++ 기본 클래스의 상속되고 재정의 된 속성 값에 액세스하는 방법은 무엇입니까?

class A{ 
public: 
    A(){number = 1;} 
    int number; 
}; 
class B : public A{ 
public: 
    B(){number = 2;} 
}; 

class Base { 
public: 
    Base() {myAttribute = new A();} 
    int returnAttrNumber(){return myAttribute->number;} 
    A *myAttribute; 
}; 

class Inherited : public Base{ 
public: 
    Inherited(){myAttribute = new B();} 
    B *myAttribute; 
}; 


int main() 
{ 
    Inherited *i = new Inherited(); 
    std::cout << i->returnAttrNumber(); // outputs 1, because it gets the A not the B. I want it to output 2, to get the B object in returnAttrNumber() 
} 

는 A-파생 된 개체 B를 보유하고 그리고 기본 클래스의 메소드를 호출하려고하지만 이 (static_cast없이 또는 dynamic_cast는 ) 가능한 한 멀리 해당 개체의 hirarchy에서 아래로 캐스팅 한 후 B 객체가 아니라 먹고 싶어하고 물건을 할

인가 (이이 경우에 수의 반환) 큰 어려움없이 C++의 기본 클래스에서 다운 캐스팅을 수행 할 수있는 방법이 있습니까? 답변 해 주셔서 감사합니다.

+2

실제 코드를 게시하십시오. 세부 사항이 중요합니다. – juanchopanza

+0

"이 값은 Base에서가 아니라 Inherited에 저장된 값을 변경해야합니다."값을 변경할 수있는 멤버는 하나뿐입니다. 판타지 코드를 사용하지 마십시오. 이 문법 오류가 너무 많아서 실제 질문에서 벗어날 수 있습니다. – user463035818

+0

예, 죄송합니다. 현재 고쳐졌습니다. – mep

답변

0

,

자료 및 상속은 다른 변수

상속에 나는 B로 MyAttribute을 다시 선언하기 때문이다 있습니다. 이것은 실수였습니다. 나는 그것이 같은 이름으로 선언 할 때, 그것은 같은 변수가 될 것이라고 생각했다. 그것은 잘못된 것이다. 전체 솔루션은 상속 된에서이 한 줄의 주석 처리를 제거하는 것입니다. 작업 코드 :

class A{ 
public: 
    A(){number = 1;} 
    int number; 
}; 
class B : public A{ 
public: 
    B(){number = 2;} 
}; 

class Base { 
public: 
    Base() {myAttribute = new A();} 
    int returnAttrNumber(){return myAttribute->number;} 
    A *myAttribute; 
}; 

class Inherited : public Base{ 
public: 
    Inherited(){myAttribute = new B();} 
    //B *myAttribute; 
}; 


int main() 
{ 
    Base *i = new Inherited(); // this works, what is necessary in my case 
    std::cout << i->returnAttrNumber(); // outputs 2 now 
} 
0

이것은 매우입니다. 빠른 대답은 정규화 된 식별자를 통해 기본 클래스에서 변수에 액세스 할 수 있다는 것입니다. 다음

#include <iostream> 

class A 
{ 
public:  
    A() 
    : var(1) {} 

protected: 
    int var; 
}; 


class B : public A 
{  
public: 
    B() 
    : var(2) {} 

    int getBVar() const 
    { 
     return var; 
    } 

    int getAVar() const 
    { 
     return A::var; 
    } 

private: 
    int var; 
}; 

int main() 
{  
    B b; 
    std::cout << "A: " << b.getAVar() << std::endl; 
    std::cout << "B: " << b.getBVar() << std::endl; 
} 

출력 : 다음 예제를 타고 아래로 캐스팅 비트 ... 자료 소개

A: 1 
B: 2 

을 상속하는 다른 변수가 있습니다. 서로 대립 할 수는 없습니다. rioki 말했다 아니라

+0

좋습니다, 감사합니다! 내 프로그램의 hirarchy에는 많은 수업이 포함되어 있기 때문에 좋지는 않지만 가능합니다. 이것은 나에게 매우 특정한 문제가 아닌 것 같아서, 왜 내가 왜 던져 내지 못하고, 왜 객체가 힌트를 줄 수 없는지 궁금해했다. 상속 된 타입은 (기본 클래스에서) 무엇인가? 정확하게 당신은 매우 나쁜 디자인을 의미합니까? 그것을 할 수있는 더 좋은 방법이 있습니까 (예를 들어서/그런 종류의 평행 한 hirarchy를하기 위해)? – mep

+1

"myAttribute"에 별명을 지정했기 때문에. 처음에는 모두 동일한 객체를 가리키고 있지만 A가 myArtibute를 다른 인스턴스로 변경한다고 가정 해 봅시다. B의 구현에 대해서는 아무 것도 모르기 때문에 업데이트 할 수 없습니다. 이제 두 포인터가 * 다른 * 객체를 가리키고 있습니다. – rioki