C++ 关于C++;,派生类可以从基类获得实现而不显式定义它吗
下面是一个错误 错误LNK2001:未解析的外部符号“public:virtual void\uu thiscall C::Foo(void)”(?Foo@C@@UAEXXZ) <基本> <代码> c::Test-()/Case>不能自动继承<代码>::测试()//>代码,我们必须在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
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上测试了它,我必须实现所有功能才能成功编译。