[英]C++ calling pure virtual function from non virtual function in base class
我知道您可以/不應在構造函數中調用虛擬函數,並且不可能使用純虛擬析構函數。
我有兩個班,基礎班和兒童班。
Base具有純虛函數和稱為虛函數的普通函數。
// base.h
class Base {
public:
virtual int foo() const = 0;
int bar() const;
};
// base.cpp
#include "base.h"
int Base::bar() const {
return this->foo()*3;
}
子級實現虛擬功能。
// child.h
#include "base.h"
class Child : public Base {
public:
int foo() const;
};
// child.cpp
#include "child.h"
int Child::foo() const {
return 5;
}
然后,我創建在基礎中定義的子對象和調用欄。
// main.cpp
#include "child.h"
...
Child c;
std::cout << c.bar();
...
然后clang編譯器給我一個鏈接器錯誤
Undefined symbols for architecture x86_64:
"Base::bar() const", referenced from:
_main in main.cpp.o
"vtable for Child", referenced from:
Child::Child() in main.cpp.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
這對我來說沒有意義,因為據我所知,有一個純虛擬成員函數foo由子類定義。 據我所知,bar未標記為虛擬,因此應定義一個符號。 是某種程度上的過渡虛擬嗎?
我要去哪里錯了?
編輯:這是我的CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
project(inheritance)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(inheritance ${SOURCE_FILES})
編輯2:按照@dasblinkenlight的答案,必須將源文件編譯在一起,因此必須將最后一個代碼塊的第6行更改為
set(SOURCE_FILES main.cpp base.cpp child.cpp)
您有一個拼寫錯誤,Base :: bar函數中缺少“ const”,然后與Base類中聲明的函數簽名不同。
// base.cpp
int Base::bar() const {
return this->foo()*3;
}
我知道您可以/不應在構造函數中調用虛擬函數,並且不可能使用純虛擬析構函數。
聲明純虛擬功能並不意味着您無法為其提供實現。 這也適用於析構函數:
struct Foo {
virtual ~Foo() = 0;
...
};
Foo::~Foo() {
... // Implement destructor
}
然后clang編譯器給我一個鏈接器錯誤
Undefined symbols for architecture x86_64: "Base::bar() const", referenced from:
當您錯誤地一對一地編譯類,然后沒有正確鏈接它們時,通常會發生這種情況。 編譯器有一種簡單的方法可以將所有類編譯在一起,並鏈接結果,如下所示:
g++ base.cpp child.cpp main.cpp
請注意,您需要在其實現文件中包含類的標題,例如
#include "base.h"
int Base::bar() {
return this->foo()*3;
}
確保您修復了過程中出現的所有錯誤(提示:以上內容將產生錯誤)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.