C++ 多态性 : return type of a virtual method

标签 c++ polymorphism return-type

我的主课是:

class Data{
public:
    Data(std::string name):name_(name){};
    virtual ~Data(){};

protected:
    std::string name_;
};

因为我想允许任何类型的数据,所以我使用模板来创建我的继承类:

template<typename Type>
class GenericData : public Data{
 public:
    GenericData(std::string name, Type t);

private:
    Type t_;
};

template<typename Type>
GenericData<Type>::GenericData(std::string name, Type t):
    Data(name),
    t_(t)
{}

第三类是(通用)数据的集合:

class Input{
public:
    Input();
    ~Input();

private:
    std::vector<Data*> d_;
};

Input::Input(){
    d_.push_back(new GenericData("double",3.2);
    d_.push_back(new GenericData("int",2);
}

Input::~Input(){
    for(unsigned int i(0);i<d_.size();i++){
    delete d_[i];
    d_[i] = NULL;
    }
}

我不知道该怎么做的是得到 t_来自 Input 的值类(class)。我想要一个 templata<typename Type> Type Input::get(unsigned int i)返回 t_ 的方法.我想我应该在 Data 中创建一个虚方法和 GenericData 中的另一种方法但我无法让它发挥作用。

最佳答案

这很简单:

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

class Data{
public:
    Data(std::string name):name_(name){};
    virtual ~Data(){};

protected:
    std::string name_;
};

template<typename Type>
class GenericData : public Data{
 public:
    GenericData(std::string name, Type t);

    Type Get() { return t_; }
private:
    Type t_;
};

template<typename Type>
GenericData<Type>::GenericData(std::string name, Type t):
    Data(name),
    t_(t)
{}

class Input{
public:
    Input() {}
    ~Input();

    void Add(Data*v) {d_.push_back(v);}
    template<typename T>
    T Get(int i) {
        return dynamic_cast< GenericData<T> *>(d_[i])->Get();
    }
private:
    std::vector<Data*> d_;
};

Input::~Input(){
    for(unsigned int i(0);i<d_.size();i++){
    delete d_[i];
    d_[i] = NULL;
    }
}

int main() {
        Input inp;
        inp.Add(new GenericData<int>("1", 1));
        inp.Add(new GenericData<double>("2", 2.0));
        std::cout << "1: " << inp.Get<int>(0) << "; 2: " << inp.Get<double>(1) << std::endl;
        return 0;
}

关于C++ 多态性 : return type of a virtual method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19422735/

相关文章:

c++ - std::istream 没有命令行?

c++ - 使用 boost.signals2 中继信号

c++ - 当工作线程完成时,我如何安全地终止它们?

c++ - 我找不到 g_io_channel_win32_make_pollfd 的任何文档

c++ - 指向模板类的共享指针的 vector

C数组和函数,如何返回?

c++ - 重载可变参数函数,返回类型取决于参数数量

Swift继承函数返回类型不能是子类型

c++ - 检查指向基类的指针是否是使用可变参数模板派生的指针之一

c++ - 棘手的多态性和虚函数