簡體   English   中英

C ++從基類中的非虛函數調用純虛函數

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

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