C++ 简单继承获得Vtable错误

C++ 简单继承获得Vtable错误,c++,eclipse,eclipse-cdt,C++,Eclipse,Eclipse Cdt,因此,我尝试编译以下简单代码: // In Test.h #include <iostream> using namespace std; class A{ public: virtual string f (string&); }; class B : public A{ public: B (string); string f (string&); }; // In Test.cpp #include <iostream&g

因此,我尝试编译以下简单代码:

// In Test.h
#include <iostream>
using namespace std;

class A{

public:
    virtual string f (string&);
};

class B : public A{

public:
    B (string);
    string f (string&);
};

// In Test.cpp
#include <iostream>
#include "Test.h"
using namespace std;


B :: B (string row){
    cout << "HERE";
}

string B :: f (string& x){
    cout << "Test";
}
//在Test.h中
#包括
使用名称空间std;
甲级{
公众:
虚拟字符串f(string&);
};
B类:公共A{
公众:
B(字符串);
字符串f(字符串&);
};
//在Test.cpp中
#包括
#包括“Test.h”
使用名称空间std;
B::B(字符串行){

cout我认为您要么必须通过在声明末尾编写
=0
使
A::f(string&)
抽象化,要么实际提供
A::f


由于当前虚拟函数
A::f
不存在,编译器无法为其创建vtable(虚拟函数表).

没有。除了一个main之外,我写的代码就是所有的东西,main有一个简单的
返回0
你赢了:)。为什么函数必须是纯虚拟的,而不仅仅是虚拟的,为什么删除构造函数实现可以让它编译?只有虚拟的(非抽象的)函数需要函数实现来创建vtable。vtable基本上包含所有虚拟函数的地址。不知道为什么删除构造函数会允许编译(它不应该)。这个问题迟早会在其他地方再次出现…@ShardulUpadhyay:您刚刚声明了一个函数,但没有定义它。您需要定义一个函数,以便链接器链接到其编译的定义。纯虚拟函数可能没有定义,因此使函数纯虚拟将起作用,或者您需要定义它。当然,您需要我们也可以在基类中提供一个默认实现(
virtualstringf(string&){}
),编译器会很高兴的
要有impl,那么它必须是Cygnus提到的纯虚拟的。@thekashyap:鉴于代码示例,很难说函数是否需要纯虚拟。对于记录,函数可以是纯虚拟的,但有一个定义,是的,它在某些情况下有帮助。