2016-06-21 8 views
0

私の間違いが設計上の問題かコードエラーかどうかを理解しようとしています。私の検索はスライシングの問題に私を指摘しましたが、私はここで問題ではないと思います。ポモモフィズム、コンストラクタで使用されるオーバーライドされたメソッド - 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であることを思い出してください。

BaseC構成の一部として構築されていても、BaseBが構築されている(コンストラクタ実行中)、BaseCというオブジェクトはありません。

標準では、コンストラクタ(およびデストラクタ)がBaseBのときに、load()を呼び出すと、BaseB::load()が呼び出されることが義務付けられています。 Not BaseC::load()

関連する問題