2014-11-15 2 views
1

C++ 클래스의 정적 데이터 멤버 (다형성 클래스 변수)에 다형성을 사용할 수 있습니까?C++ 클래스의 정적 데이터 멤버에 대한 다형성

업데이트 : b4hand 명시된 바와 같이, 다형성 메소드는 기본 클래스에서 선언되어야합니다. 그러나이 시나리오에서는 사용자가 containerDerived에서 어떤 메서드를 만들지 미리 알 수 없기 때문에이 작업을 수행 할 수 없습니다.

참조를 포함하도록 예제를 편집했습니다. 나를 상기시켜 주셔서 감사합니다.

#include <iostream> 

class numBase     //numBase is in a library user can not edit 
{ 
}; 

class numDer : public numBase //user defined class is a kind of numBase 
{ 
    private: 
     int num; 
    public: 
     void printNum() { std::cout << " numDer=" << num; } 
     void inc() { num++; } 
}; 

class containerBase    //containerBase is in a library user can not edit 
{ 
    protected: 
     //static numDer& count; //this compiles, but count can not be initialized to other types 
     static numBase& count; //this causes error six lines down from here 
}; 

class containerDerived : public containerBase //user defined class is a kind of containerBase 
{ 
    public: 
     void inc() { count.inc(); } //error: 'count' was not declared in this scope 
     void printCount() { std::cout << " containerDerived"; count.printNum(); } 
}; 

/************************ user program **********************/ 
//initilialize static variable 
numDer number;    //number could be any user defined type derived from numBase 
numDer& containerBase::count = number; //initialize count to a kind of numBase 

int main() 
{ 
    containerDerived container1; 
    containerDerived container2; 

    container1.printCount(); 
    container1.inc(); 
    container2.inc(); 
    container1.printCount(); 
} 

감사합니다 :

다음은 파생 형 (numDer)에 정적 기본 유형 (numBase)를 초기화하는 나의 시도이다.

+0

'numBase'는 빈 클래스입니다. 'inc()'메소드가 없습니다. 컴파일러 오류가 여기에 꽤 설명이 있습니다, 당신은 실제 문제가 무엇에 더 자세히 설명해 주시겠습니까? –

+0

다형성을 원한다면 다른 곳과 같이 포인터를 사용하십시오. – molbdnilo

+0

'count'가'numBase' 인스턴스가 아니고 numBase 포인터가 아니기 때문에 그럴 수 없습니다. –

답변

1
static numBase count; 

숫자가 numBase의 개체라고 선언했습니다. 그리고 그 객체를 통해 numBase, 즉 numDer.inc()의 파생 클래스 멤버를 호출하려고합니다. 실행 시간 다형성은 포인터/참조가 사용될 때만 적합하므로이 호출은 확실하게 성공하지 못합니다.

0

당신이하려고하는 방식대로 할 수 없습니다.

numDernumBase에 할당하면 개체가 "슬라이스"되어 더 이상 올바른 유형이되지 않습니다.

다형성 동작을 얻으려면 포인터 또는 참조를 사용해야합니다.

컴파일러가 inc 메서드가 numBase에 존재하지 않는다고 올바르게 오류를보고하고 있습니다.

다형 메소드는 기본 클래스에서 선언되어야하며 virtual으로 선언되어야합니다.

+0

"must"는 강한 단어입니다. 가상으로 선언해야합니다. 그리고 기지의 소멸자도 그렇게해야합니다. 파생 클래스에 대한 포인터/참조로 기본 사례를 선언하지 않으려는 경우에는 가상 선언을 모두 수행 할 필요가 없습니다. 가상 키워드를 생략하면 옵티 마이저가 주어질수록 프로그램 속도가 빨라질 수 있습니다. –

+0

가상으로 선언되지 않으면 실제로 메소드에 대한 다형성 동작을 얻지 못합니다. 대신 그림자 메서드가 생기고 기본 포인터가 호출되면 항상 기본 구현을 얻습니다. 그래서 ** ** 원하는 행동이 다형성이라면 "~해야한다"가 적절하다. 질문은 태그가 있고 다형성을 나타 내기 때문에 반드시 "꼭"해야하는 것처럼 들립니다. 또한 잘못된 메소드가 호출되고 잘못된 동작이 발생하면 더 빨리 실행하는 것에 대한 성명서는 쓸모가 없습니다. – b4hand

관련 문제