我是C ++的新手。在尝试样本多态性代码时,我发现派生类中的基类虚函数定义只有在派生类中定义或外部使用派生类中的声明时才有可能。
以下代码给出错误:
class B
{
public:
virtual void f();
};
void B::f() {
std::cout<<"B::f";
}
class D : public B
{
public:
void f2() {int b;}
};
// error: no "void D::f()" member function declared in class "D"
void D::f() {
std::cout<<"D::F";
}
如果我在D中声明f(),它可以工作。我想知道为什么我需要在Base类中声明它时再次显式声明该函数。编译器可以从Base类获得签名吗?
提前致谢..
答案 0 :(得分:9)
您无法将成员添加到类定义之外的类中。如果您希望D
覆盖B::f
,则必须在类定义中声明它。这些是规则。
声明基类中的成员不会自动为派生类提供相同的成员。从基类继承为派生类提供基类的所有成员,因此您可以选择是否覆盖,隐藏或添加到基类成员,但是您必须通过声明覆盖函数来指示在类定义中覆盖的选项。
答案 1 :(得分:3)
即使D派生自B,因此您可以在D的实例上调用f(),但这并不意味着您不需要将声明放入标题中。
您实现的任何函数都必须在标题中显式声明。
但是,您不需要将其实现放在那里。刚
class D : public B
{
public:
/*virtual*/ void f();
};
您可以选择是否在此处加入“虚拟”一词
答案 2 :(得分:1)
在C ++中,您的类定义告诉编译器该类实现了哪些函数。因此,如果要编写函数“D :: f()”,则必须在D的类定义中使用f()。
函数“B :: f()”已在基类中定义的事实无关紧要。每个类定义必须显式声明它实现的函数。
答案 3 :(得分:0)
如下更改D类的代码,然后尝试:
class D : public B
{
public:
void f() override;
};
// error: no "void D::f()" member function declared in class "D"
void D::f() {
std::cout << "D::F";
}