代码之家  ›  专栏  ›  技术社区  ›  shoosh

纯基类需要从dll导出?

  •  5
  • shoosh  · 技术社区  · 14 年前

    我有两个dlls a.dll和b.dll,每个dlls中有一个类a class和b class。
    我希望a class和bclass继承并实现同一个接口absbase,这是一个纯抽象类。
    在每一个类中,我都为declspec(dllimport)和declspect(dllexport)设置了定义。当我试图编译时,我得到了:

    警告C4275:非dll接口类“aclass”用作dll接口类“absbase”的基

    它基本上要我声明absbase为uu declspec(dllexport)
    但是如果编译器按他的方式运行,我就必须声明absbase从a.dll和b.dll中导出。

    为什么需要导出类的接口?
    有什么办法吗? 我真的应该从两个DLL导出absbase吗?这不是天生的问题吗?(我需要定义一个新的xxx_导出宏..)

    3 回复  |  直到 14 年前
        1
  •  3
  •   bdk    14 年前

    它看起来像是一个编译器警告,而不是一个错误,所以它仍然可以工作。编译器只是让您知道您正在做一些容易出错的事情。只要DLL和核心程序都同意基类的定义,那么这样做应该是完全可以接受的。

    您应该能够使用pragma来抑制警告:

    http://forums.devx.com/archive/index.php/t-84785.html

        2
  •  1
  •   Hans Passant    14 年前

    这是件让人烦恼的事。编译器检测到基类中的代码可能运行。它不是纯粹的虚拟方法,它知道如何过滤这些方法。可能是构造函数还是析构函数?失败模式是类对象的内存布局在客户端代码和DLL中可能不相同。这导致的运行时混乱是 非常 很难诊断。

    只要您能保证客户端和DLL使用完全相同的CRT和这些工具版本,使用完全相同的编译和链接设置进行编译,就可以了。通过使用非标准的uuu interface关键字而不是类,可以使基类被保证为抽象的。

        3
  •  0
  •   Notinlist    14 年前

    我有一个小窍门:

    class Base {
      public:
        virtual void f() = 0;
        virtual void g() = 0;
        virtual ~Base();
    };
    
    class A: public Base {
      public:
        virtual void f();
        virtual void g();
    };
    
    class B: public Base {
      public:
        virtual void g(); // REVERSE ORDER
        virtual void f();
    };
    

    虚拟方法表中f和g的顺序是在基类中指定的,这一信息是非常需要的。