2016-06-21 76 views
0

我想了解,如果我的錯誤來自設計問題或代碼錯誤。我的搜索指出我切片問題,但我不認爲這是問題在這裏。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()