我一直在努力去理解,爲什麼我可以在頭文件中創建一個純虛函數,這個頭文件還沒有在我正在使用的庫中實現,而且這不會導致鏈接或甚至運行時失敗.. 上面可能有點不準確,但這裏有一些代碼來備份它。C++共享庫:純虛函數不會導致鏈接錯誤
下面是一個接口定義:
class A
{
public:
static A* Create();
virtual ~A() {}
virtual status_t start() = 0;
virtual status_t stop() = 0;
};
我有一個C++共享庫,它包含的實現 「的AIMP1」 +的A ::創建()函數(見下文):
A* A::Create {return new AImpl;}
class AImpl : public A
{
public:
A() {}
virtual ~A() {}
virtual status_t start() {}
virtual status_t stop() {}
};
我建立共享庫 - 沒問題。 現在我在頭文件中添加另一個純虛函數爲A類:
class A
{
public:
static A* Create();
virtual ~A() {}
virtual status_t start() = 0;
virtual status_t stop() = 0;
virtual status_t write() = 0;
};
創建一個使用它的測試程序:
void main()
{
A* a = A::Create();
a->start();
a->stop();
a->write();
}
現在我明白的是,上述編譯,但我認爲它會失敗鏈接,因爲共享庫中沒有write()調用的實現。 即使在運行時,也不會發生崩潰或發生任何事情。它看起來像寫呼叫被跳過。任何人都可以幫助解釋 - 這將不勝感激:-)
謝謝 - 而對於冗長的問題,對不起,這是一個有點難受,解釋了「單排」確切的問題..
您確定在更改代碼後重新編譯了它嗎?你能強制重建嗎? – leemes
是的,我相信它是重新編譯的。但正如我看到編譯器不應該抱怨。代碼沒問題。但是在lib中缺少實現,所以我會猜測鏈接錯誤。 –
你還重新編譯了這個庫嗎?由於'AImpl'是抽象的,我猜這個編譯應該在'A :: create'中失敗。 – leemes