繁体   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