WIN7系統,VC2010下。 程式A靜態鏈接B.dll動態庫。 B.dll中導出3個類: (1) 基類 class AFX_EXT_CLASS base { public: base(){}; virtual ~base(){}; virtual int getX() = 0; protected ...
WIN7系統,VC2010下。
程式A靜態鏈接B.dll動態庫。
B.dll中導出3個類:
(1) 基類
class AFX_EXT_CLASS base
{
public:
base(){};
virtual ~base(){};
virtual int getX() = 0;
protected:
int x;
......
}
(2)子類1
class AFX_EXT_CLASS derived_1
{
public:
derived_1(){};
virtual ~derived_1(){};
int getX() {return x;};
protected:
//int x; x是繼承的
......
}
(2)子類2
class AFX_EXT_CLASS derived_2
{
public:
derived_2(){};
virtual ~derived_2(){};
int getX() {return x;};
protected:
//int x; x是繼承的
......
}
函數getX()是為了防止父類實例化而設為純虛函數。
在程式A中引用該DLL,一切都是按規矩來的(頭文件包含,引入lib文件)
A中引用 dll中的類:
class A
{
base* pbase;
void OnCreateObject(int type)
{
if(type == 0)
pbase = new derived_1();
else
pbase = new derived_2();
}
。。。。。。
}
A程式將OnCreateObject與一個菜單命令連接起來,即此函數不是在系統初始化時調用。
編譯通過。但在運行中,出現了問題,系統在載入DLL過程中意外退出。
通過思考,將base函數中的純虛函數改變為:
int getX() {return x;};
而將兩個子類中的同名函數刪除,運行正常。
但問題在哪裡? 為什麼 ?
可能的原因:
該DLL在另一個DLL中也被引用,是base的指針形式,引用是通過值傳入,並沒有new實例,但可能是因為這個才導致程式不能進入吧?
在WIN10的VC2010中,程式編譯就通不過,將純虛函數改變為虛函數時,才能通過。
各位高手,你們認為呢?