C++ 关于C++;,派生类可以从基类获得实现而不显式定义它吗

C++ 关于C++;,派生类可以从基类获得实现而不显式定义它吗,c++,inheritance,virtual,C++,Inheritance,Virtual,下面是一个错误 错误LNK2001:未解析的外部符号“public:virtual void\uu thiscall C::Foo(void)”(?Foo@C@@UAEXXZ) c::Test-()/Case>不能自动继承::测试()//>代码,我们必须在C++()中显式地编写它。 class A { public: virtual void Foo()=0; virtual void Test()=0; }; class B: public A { public

下面是一个错误

错误LNK2001:未解析的外部符号“public:virtual void\uu thiscall C::Foo(void)”(?Foo@C@@UAEXXZ)

<基本> <代码> c::Test-()/Case>不能自动继承<代码>::测试()//>代码,我们必须在C++(

)中显式地编写它。
class A
{

public:  
    virtual void Foo()=0;
    virtual void Test()=0;

};

class B: public A 
{
public: 
    virtual void Foo();
    virtual void Test()=0;

};

void B::Foo()
{

}



class C: public B
{
public:
    void Foo();
    void Test();
};



void C::Test()
{
}
您已将::Test()设置为纯虚拟,因此子类必须实现它

这就是
A::Test()=0
语法的含义

如果删除
=0
,并在父类中提供实现,则不需要在子类中实现它。

您已使::Test()纯虚拟,因此子类必须实现它

这就是
A::Test()=0
语法的含义


如果删除
=0
,并在父类中提供实现,则不需要在子类中实现它。

如果派生类从父类声明虚拟方法,就像
C
void Foo()
所做的那样,那么它也必须实现它。如果要继承
B
的实现,则不要在
C
中声明
void Foo()

class C: public B
{
public:
    void Test();
};

如果派生类从父类声明了一个虚拟方法,就像
C
void Foo()
所做的那样,那么它也必须实现它。如果要继承
B
的实现,则不要在
C
中声明
void Foo()

class C: public B
{
public:
    void Test();
};

对于动态绑定,在抽象基类中只需要一个纯虚函数

编辑:我很确定你需要实现所有的函数,即使它们是空的。这就是为什么它不能为您编译

class A
{
    public:  
    virtual void Foo()=0;
    virtual void Test()=0;
};

class B: public A
{
    public: 
    void Foo();
    void Test();
};

void B::Foo()
{

}
void B::Test()
{

}


class C: public B
{
    public:
    void Foo();
    void Test();
};


void C::Foo()
{

}
void C::Test()
{
}

对于动态绑定,在抽象基类中只需要一个纯虚函数

编辑:我很确定你需要实现所有的函数,即使它们是空的。这就是为什么它不能为您编译

class A
{
    public:  
    virtual void Foo()=0;
    virtual void Test()=0;
};

class B: public A
{
    public: 
    void Foo();
    void Test();
};

void B::Foo()
{

}
void B::Test()
{

}


class C: public B
{
    public:
    void Foo();
    void Test();
};


void C::Foo()
{

}
void C::Test()
{
}

至少一个派生类必须实现在基类中声明的纯虚拟函数。至少一个派生类必须实现在基类中声明的纯虚拟函数。此外,您应该在void Test()上具有虚拟标记,并且(作为个人首选项),在重写虚拟函数时,我始终使用override关键字。这两种方法都不是让代码运行所必需的,但它们确实使您的操作更加明显,并强制进行额外的编译器检查。此外,您应该在void Test()上有虚拟标记,并且(作为个人首选)在重写虚拟函数时,我始终使用override关键字。这两种方法都不是让代码运行所必需的,但它们确实使您所做的事情更加明显,并强制进行额外的编译器检查。我在linux上测试了它,我必须实现所有功能才能成功编译。我在linux上测试了它,我必须实现所有功能才能成功编译。