rjm*_*ues 29 c++ inheritance vtable
档案啊
#ifndef A_H_
#define A_H_
class A {
public:
virtual ~A();
virtual void doWork();
};
#endif
Run Code Online (Sandbox Code Playgroud)
文件Child.h
#ifndef CHILD_H_
#define CHILD_H_
#include "A.h"
class Child: public A {
private:
int x,y;
public:
Child();
~Child();
void doWork();
};
#endif
Run Code Online (Sandbox Code Playgroud)
和Child.cpp
#include "Child.h"
Child::Child(){
x = 5;
}
Child::~Child(){...}
void Child::doWork(){...};
Run Code Online (Sandbox Code Playgroud)
编译器说对vtable有一个未定义的引用A
.我尝试了很多不同的东西,但没有一个有效.
我的目标是将类A
作为接口,并从头部分离实现代码.
Alo*_*ave 69
为什么错误以及如何解决?
您需要提供所有虚拟功能的定义class A
.只允许纯虚函数没有定义.
即:在class A
两种方法中:
virtual ~A();
virtual void doWork();
Run Code Online (Sandbox Code Playgroud)
应该定义(应该有一个正文)
例如:
A.cpp
void A::doWork()
{
}
A::~A()
{
}
Run Code Online (Sandbox Code Playgroud)
警告:
如果您希望自己class A
充当接口(在C++中也称为Abstract类),那么您应该将该方法设为纯虚拟.
virtual void doWork() = 0;
Run Code Online (Sandbox Code Playgroud)
好读:
"虚拟表"是一个未解析的外部是什么意思?
在构建C++时,链接器说我的构造函数,析构函数或虚拟表是未定义的.
我的目标是A成为一个接口,并从头部分离实现代码.
在这种情况下,将成员函数设置为A类中的纯虚函数.
class A {
// ...
virtual void doWork() = 0;
};
Run Code Online (Sandbox Code Playgroud)