![](/img/trans.png)
[英]Why does calling calling a pure virtual method without body does not result in linker error?
[英]Why is calling a pure virtual a linker error rather than a compile error?
這個程序對我來說有點意外:
struct A {
virtual void a()=0;
};
struct B : public A {
void a() {}
};
int main() {
B b;
b.a(); // OK, call B::a()
b.A::a(); // linker error?
}
給我這個錯誤(gcc 4.4):
/tmp/ccfOGuBJ.o: In function `main':
test.cc:(.text+0x28): undefined reference to `A::a()'
collect2: ld returned 1 exit status
(clang 7.0.0)
Undefined symbols for architecture x86_64:
"A::a()", referenced from:
_main in test-440cc5.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我期望嘗試調用純函數會產生顯式錯誤,因為它被聲明為已刪除,而不是隱式錯誤。 “不在此翻譯單元中的功能”與“不在任何翻譯單元中的功能”之間的標准是否有區別?
應該注意的是,嘗試直接調用純虛擬在第10.4節中沒有解決。
純虛函數可以有一個正文 。 因此,錯誤是鏈接錯誤,因為您無法提供正文。
標記一個函數純虛擬並不意味着該函數將沒有實現。 所有這意味着從您的派生類派生的類必須覆蓋此特定成員函數,或保持抽象 。 特別是,為從您的繼承和使用派生的類提供純虛函數的實現是完全合法的。
這就是為什么在鏈接階段之前無法檢測到實現的存在(或不存在)的原因:您可以在單獨的轉換單元中提供實現,因此編譯器可能不知道它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.