C++에서 다형성의 다음 예제를 고려하십시오. 나에게 이것은 예기치 않은 행동이다. 자바에서 여전히 너무 많은 것을 생각하고 있다는 사실에있다. 필자는 다음과 같은 질문을 던졌습니다.보다 구체적인 메서드를 호출하는 포인터 예제를 얻으려면 어떻게해야합니까?포인터가있는 다형성/boost :: shared_ptr
#include <iostream>
#include <string.h>
#include <boost/tr1/memory.hpp>
class Image {
public:
Image(std::string className = "Image")
: className_(className)
{}
virtual ~Image() {}
virtual std::string className() {
return className_;
}
private:
std::string className_;
};
class RightImage : public Image {
public:
RightImage()
: Image("RightImage")
{}
};
class Processor{
public:
void process(Image& image){
std::cout << "Invoking process(Image& image) with image of type \"" << image.className() << "\"" << std::endl;
}
void process(RightImage& rightImage){
std::cout << "Invoking process(RightImage& rightImage) with rightImage of type \"" << rightImage.className() << "\"" << std::endl;
}
void process(Image* image){
std::cout << "Invoking process(Image* image) with image of type \"" << image->className() << "\"" << std::endl;
}
void process(RightImage* rightImage){
std::cout << "Invoking process(RightImage* rightImage) with rightImage of type \"" << rightImage->className() << "\"" << std::endl;
}
};
int main(int argc, char **argv) {
std::tr1::shared_ptr<Image> rightImageSharedPtr(new RightImage());
Image* rightImagePointer = new RightImage();
RightImage rightImage;
Processor processor;
std::cout << "value: ";
processor.process(rightImage);
std::cout << "shared_ptr: ";
processor.process(*rightImageSharedPtr);
std::cout << "old fashioned pointer 1: ";
processor.process(*rightImagePointer);
std::cout << "old fashioned pointer 2: ";
processor.process(rightImagePointer);
}
그 프로그램의 출력은 다음 호출 프로세스 (화상 & 이미지)와 :
값 : 유형 'RightImage "
있는 shared_ptr의 rightImage와 호출 프로세스 (RightImage & rightImage) "RightImage"유형의 이미지
구식 포인터 1 : 이미지를 호출하는 프로세스 (이미지 & 이미지)를 호출하는 중입니다. "RightImage"
구식 포인터 2 입력 유형 "RightImage"의 이미지로 호출 과정 (이미지 * 이미지)
가 어떻게 마지막 세 가지 예는 process(RightImage&)
및 process(RightImage*)
호출 할 수 ? 당신이
std::tr1::shared_ptr<RightImage> rightImageSharedPtr(new RightImage());
RightImage* rightImagePointer = new RightImage();
대안은 단지 더 복잡한 방법은 각 함수를 호출하기 전에 dynamic_cast는을 수행하는 것입니다 귀하의 변수를 선언해야하므로
그리고 이것은 Java에서 작동해야합니까? – curiousguy
@curiousguy 아니에요. 하지만 자바에서는 클래스 유형을 얻기 위해 리플렉션을 사용할 수 있습니다 ;-) – sebastiangeiger