【问题标题】:Polymorphism base class pointers多态基类指针
【发布时间】:2013-02-23 05:16:47
【问题描述】:

假设我有两个模板类,一个是纯虚拟父类,另一个是从父类继承的。两者都被模板化为采用泛型类型和仿函数。例如:

template<typename T, typename funct>
class pure_virtual{
     //pure virtual members
}
template<typename T, typename funct>
class child : public pure_virtual{
     //members
}

在我的主目录中,我想在不使用动态内存的情况下创建一个指向我的子类的 pure_virtual 指针。例如:

int main(){
     pure_virtual<int*,my_functor>* p;
     child<int*,my_functor> c(my_functor);
     p = &c;
     return 0;
}

这个实现给了我一个编译错误,指出它不能将类型 child 转换为类型 pure_virtual。关于我在这里做错了什么的任何想法?我知道如果我使用动态分配,这将起作用;但是,如果可能的话,我真的很想避免它。

谢谢

【问题讨论】:

    标签: c++ templates polymorphism


    【解决方案1】:

    您已成为令人烦恼的解析的受害者。 child&lt;int*,my_functor&gt; c(my_functor) 没有声明 child&lt;int*,my_functor&gt; 对象,而是声明了一个接受 my_functor 并返回 child&lt;int*,my_functor&gt; 的函数。

    这样的函数不能转换成pure_virtual&lt;int*,my_functor&gt;*

    要解决这个问题,将该行更改为:

    child<int*,my_functor> c((my_functor()));
    

    【讨论】:

    • 不幸的是,这产生了一个新错误。如下所述,一个修复方法是实例化函子。还是谢谢!
    【解决方案2】:

    这是一个可编译的例子:

    template<typename T, typename funct>
    class pure_virtual{
         //pure virtual members
    };
    
    template<typename T, typename funct>
    class child : public pure_virtual<T,funct> {
      public:
         //members
         child(funct) { }
    };
    
    struct my_functor {};
    
    int main(){
         pure_virtual<int*,my_functor>* p;
         my_functor f;
         child<int*,my_functor> c(f);
         p = &c;
         return 0;
    }
    

    【讨论】:

      【解决方案3】:

      1)

      class child : public pure_virtual< T, funct> {
      ...
      

      2)

      孩子 c(my_functor);

      如果my_functor 是一个类型,那么你不能将它传递给c-tor。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-31
        • 1970-01-01
        • 2011-02-11
        • 2011-10-10
        • 1970-01-01
        • 2018-01-02
        • 2011-05-03
        • 2018-04-21
        相关资源
        最近更新 更多