我有一個類,它從具有純虛擬函數的類繼承。當缺少未使用的純虛擬方法的實現時,鏈接失敗
現在我需要添加另一個類,它不需要某種方法。我有一個想法沒有實現這個方法,而不是總在下面的例子中拋出一個異常時,調用此方法,如:
#include <iostream>
class ibase {
public:
virtual void foo() = 0;
virtual void boo() = 0;
};
class base1 : public ibase {
public:
virtual void foo(){ std::cout<<"base1::foo"<<std::endl; }
virtual void boo(){ std::cout<<"base1::boo"<<std::endl; }
};
class base2 : public ibase {
public:
virtual void foo() { std::cout<<"base2::foo"<<std::endl; }
virtual void boo();
};
int main()
{
ibase *inst1 = new base1;
ibase *inst2 = new base2;
inst1->foo();
inst1->boo();
inst2->foo();
}
但是,當我嘗試使用下一個編譯器選項編譯:
g++ dfg.cpp -ansi -pedantic -Wall
本實施例中生產下一輸出(使用克++ 4.3.0):
/tmp/ccv6VUzm.o: In function `base2::base2()':
dfg.cpp:(.text._ZN5base2C1Ev[base2::base2()]+0x16): undefined reference to `vtable for base2'
collect2: ld returned 1 exit status
有人可以解釋爲什麼在鏈接失敗? boo()方法不被調用。
爲什麼你不想拋出異常?它是檢測它是否被調用的最安全的方法。另外,如果某些子類不需要它,則可能需要修改接口。 – 2011-03-18 12:15:06
@Space_COwbOy我以爲如果有人試圖使用這種方法,我會得到一個編譯器錯誤(就像你沒有定義一個不應該使用的方法的模板專門化一樣) – 2011-03-18 12:20:00
純虛函數的一般思想是**強制**派生類來實現這些功能。現在你寧願不? :-) – 2011-03-18 17:05:59