我要做一个基类(比如视频控件),定义好虚方法,在显示画面(窗体中)动态的创建此控件,使用相同的方法比如:Init(),Start(),Stop()。
此基类作为开发包提供给别人,别人如果使用的厂家不同,要写新的视频子类(控件),只能够从我的基类继承,具体在窗体中引用不能改写了,都是我定义好的。
在此我就有点疑惑,如果我的程序中不引用别人的子类,能够根据他们的子类名称来动态创建对象吗?
---------------------
请大家提供思路,提供这样的基类行吗?如何实现?用CRuntimeClass吗?
VC很不熟悉,谢谢大家!

解决方案 »

  1.   

    定义好基类,其他人如果有不同的行为,就需要在Init Start, Stop等中实现自己的行为,然后你调用基类的指针就好了,多态就可以达到调用别人开发的行为
      

  2.   

    其实你提供的也只是一个接口,将你的实现给封装起来,做成dll,然后只提供接口给厂家调用就是。注意基类的实现和接口是分开的(你当然不希望厂家看到你的实现吧)。这方面你要看一下ATL或者COM方面的知识。
      

  3.   

    Init Start, Stop这3个方法的实现肯定是别人实现了,我只负责调用。别人实现的DLL放在我的目录下即可。我疑问的是我不引用别人的头文件,也可以动态调用吗?
    我的想法是我提供界面开发平台,别人继承我的基类,实现,我只负责调用控件。不知道能否行得通,做个简单的DEMO测试下了。
      

  4.   

    你定义好base class接口.. 然后自己程序只操作这些接口. 以后别人实现是他的事. 反正你会始终调用接口. 是可以的. 此为接口编程. 
      

  5.   

    楼主你的想法其实就是这么两个学术问题:在MFC里面叫做动态创建,在Java和C#里面叫做反射,就是框架如何创建用户自定义类型的问题:http://tech.163.com/05/0405/10/1GIP27EB00091589.html
    http://topic.csdn.net/u/20091117/19/7faa3bfe-cee9-43cb-b6ae-0a55559b6730.html提供两个链接,先看看。
      

  6.   

    包装成MFC扩展DLL,这个相应的比较好用些。// the vedio window class
    class __declsdec(dllexport) CVedioCtrl abstract : public CWnd
    {
    public:
        // constructor & destructor
        CVedioCtrl();
        virtual ~CVedioCtrl();    // Implementation
        virtual void Initialize() = 0; // initialize the control status.
        virtual BOOL Start() = 0; // start to do vedio, or other things.
        virtual void Stop() = 0; // stop to do vedio.
    };类的接口声明这样写已经差不多了,在其中包装更多需要的方法即可。至于动态创建,是一个实例化的过程,这个过程,无论是程序员,还是最终用户,它知道他想要的是什么,他自然会选定对应的对象,也就是说,这里他会告诉你,这个被实例化的类是什么类。这应该是一个管理框架类。
    可以是这样,写一个Manager管理类,里面有一个方法,例如virtual CVedioCtrl* GetInstance();这个方法可以被重写,默认情况下,有一个实现,在DLL内部,这个方法返回一个默认的对CVedioCtrl接口对象的实现,return net CXXXXX();
    这个Manager里,应该有一个清理方法,亦可以被重写,例如virtual void DisposeData(); 默认行为是清理这个CVedioCtrl*的对象,delete XXX;
    如果你想要使用运行时,CRuntimeClass,MFC里有对应的宏,DECLARE_DYNCREATE(ThisClassName)和IMPLEMENT_DYNCREATE(ThisClassName, BaseClassName),那么,你还需要在这个管理类里添加一样东西,那就是保存即将被创建的对象的运行时信息,因此,你需要提供一个方法,供给用户去设置这些信息。如果不使用运行时,那么这个创建的过程,完全可以由用户完成,在使用的时候,直接使用其它指针即可。
      

  7.   

    这个完全可以实现,我用directshow开发视频的时候很多方法都是封装好了的,像directshow提供的IMediaControl接口就实现了run stop pause这样一系列的方法,楼主的想法完全可行
      

  8.   

    换种说法:即界面、基类都是我的,用户继承我的基类(编写DLL),我的界面要根据配置的文件(用户自己写的DLL名称,子类名称等)来调用子类。
    这样可以实现吗?
    ----------------
    感觉有点绕
      

  9.   

    涉及到:动态加载用户的DLL,动态创建子类对象...