2016-06-21 1 views
0

실수가 디자인 문제 또는 코드 오류에서 비롯된 것인지 이해하려고합니다. 내 검색은 나를 슬라이싱 (Slicing) 문제로 지적했지만이 문제가 여기에서 문제가되는 것은 아닙니다.Poylmorphism, 생성자에서 사용되는 오버라이드 된 메서드 - C++

#include <string> 
#include <iostream> 
#include <vector> 

    class BaseA { 
    public: 
     BaseA(const std::string &n) 
      : name(n) 
     {} 
     virtual ~BaseA() 
     {}; 
     virtual void print() const 
     { 
      std::string str(""); 
      str += name; 
      std::cout << str << std::endl; 
     } 

    protected: 
     std::string name; 
    }; 

    class BaseB : public BaseA { 
    public: 
     BaseB(const std::string &n, const std::string &v) 
      : BaseA(n), value(v) 
     { 
      load(); 
     } 
     virtual ~BaseB() 
     {}; 
     virtual void load(){ 
      c = 'B'; 
     } 
     char getC() { 
      return c; 
     } 
     void print() const{ 
      std::string str(""); 
      str += name; 
      str += ' '; 
      str += value; 
      std::cout << str << std::endl; 
     } 
    protected: 
     char c; 
    private: 
     std::string value; 
     int data = 0; 
    }; 

    class BaseC : public BaseB { 
    public: 
     BaseC(const std::string &n, const std::string &v) 
      : BaseB(n, v) 
     { 
     } 
     void load() override{ 
      c = 'C'; 
     } 
    }; 

    int mainTest() 
    { 
     std::vector<BaseB*> vec; 
     vec.push_back(new BaseB("John", "singer")); 
     vec.push_back(new BaseC("Raoul", "wannabe")); 
     for (BaseB *obj : vec) 
     { 
      obj->print(); 
      std::cout << "load class: " << obj->getC() << std::endl; 
     } 
     return(0); 
    }; 

는 내가 기대했던 결과는 다음과 같습니다

John singer 
load class: B 
Raoul wannabe 
load class: C 

하지만 모두 B를 얻을. 생성자에서 재정의 된 클래스를 사용할 수 없다는 뜻입니까? 감사합니다.

답변

3

그것은 불가능하지 않지만 원하는대로 할 수 없습니다.

BaseC의 경우, 구성 순서는 BaseA, BaseB, BaseC입니다. BaseB는 (실행 생성자)를 구성하는 동안에는

는 그것이 BaseC 구성의 일부로서 구성되는 경우에도 BaseC 같은 그러한 오브젝트가 없다.

따라서 표준에서는 생성자 (및 소멸자)가 BaseB 일 때 load()을 호출하면 BaseB::load()이 호출됩니다. 하지 않음 BaseC::load()

관련 문제