Poylmorphism,构造函数中使用的重写方法 - C ++

时间:2016-06-21 14:47:42

标签: c++ oop polymorphism

我试图了解我的错误是来自设计问题还是代码错误。我的搜索指出了切片问题,但我不认为这是问题所在。

#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.这是否意味着在构造函数中,不可能使用重写的类? 感谢

1 个答案:

答案 0 :(得分:3)

这不是不可能的,但它可能不会做你想要的。

回想一下,对于BaseC,构造顺序为BaseABaseBBaseC

正在构造BaseB(构造函数执行)时,没有BaseC这样的对象,即使它是作为BaseC构造的一部分构造的。

因此,标准规定在BaseB的构造函数(和析构函数)期间,调用load()将导致BaseB::load()被调用。不是BaseC::load()