Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 数据类型和多态性_C++_Types_Polymorphism - Fatal编程技术网

C++ 数据类型和多态性

C++ 数据类型和多态性,c++,types,polymorphism,C++,Types,Polymorphism,我有一个设计问题。我想要实现接口的自定义数据类型。例如,使用模板很简单(也许下一个设计是不正确的-因为我可以做一个泛型类而不是下一个-但明确了我的目标): 注意:我的英语不好,请为我的错误道歉:)您可以通过三种方式实现这一点,没有一种方式比使用模板更优雅、更无错误 将数据定义为基类中int/float/char的并集,并通过基类的set/get方法对该并集进行操作。整个VB(旧的VB6)类系统都使用这种称为VARIANT的数据类型 从基类返回void*,并进行适当的施放和使用-恶心&祝你好运 从

我有一个设计问题。我想要实现接口的自定义数据类型。例如,使用模板很简单(也许下一个设计是不正确的-因为我可以做一个泛型类而不是下一个-但明确了我的目标):


注意:我的英语不好,请为我的错误道歉:)

您可以通过三种方式实现这一点,没有一种方式比使用模板更优雅、更无错误

  • 将数据定义为基类中int/float/char的并集,并通过基类的set/get方法对该并集进行操作。整个VB(旧的VB6)类系统都使用这种称为VARIANT的数据类型
  • 从基类返回void*,并进行适当的施放和使用-恶心&祝你好运
  • 从getData返回基本接口引用本身,虽然看起来有意义,但根本没有意义。 四,

  • C++是不正确的语言来做这样的事情。您无法自动执行此操作,只能手动执行,方法是在object中保存类型标识,创建visitor may be,存储void*(boost::any,boost::variant)as字段等。请参见此@永远说了很多。呃,你的第二个和第三个建议有什么问题?
    template <typename T>
    class IDatatype
    {
    public:
        virtual T getData() const = 0;
        virtual void setData(T pData) = 0;
    };
    
    class MyChar: public IDatatype<char>
    {
    public:
        void setData(char pData){...}
        char getData() const{...}
    
    private:
        char _data;
    };
    
    class MyInt: public IDatatype<int>
    {
    public:
        void setData(int pData){...}
        int getData() const{...}
    
    private:
        int _data;
    };
    
    IDatatype<int> *data = new MyInt(); // parametrized interface, bad idea :(
    data->getData(); // it works ok
    
    class IDatatype
    {
    public:
        // pure virtual getters and setters for specialized _data fields. Here is my design question.
    };
    
    class MyChar: public IDatatype
    {
    public:
        void setData(char pData){...};
        char getData(){...};
    
    private:
        char _data;
    };
    
    class MyInt: public IDatatype
    {
    public:
        void setData(int pData){...};
        int getData(){...};
    
    private:
        int _data;
    };
    
    IDatatype *intData = new MyInt(); // no parametrized interface!
    intData->getData(); // how can I create this method from IDatatype?
    
    IDatatype *charData = new MyChar();
    charData->getData(); // the same here