C ++从基类中的非虚函数调用纯虚函数

问题描述 投票:0回答:2

我知道你可以/不应该在构造函数中调用虚函数,并且不能使用纯虚析构函数。

我有两个班,Base和Child。

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实现虚函数。

// 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)
c++ linker-errors clang++ virtual-functions
2个回答
© www.soinside.com 2019 - 2024. All rights reserved.