簡體   English   中英

為什么調用純虛擬鏈接器錯誤而不是編譯錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM