类外的C ++虚函数实现

问题描述 投票:8回答:4

我是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类获得签名吗?

提前致谢..

c++ polymorphism virtual-functions
4个回答
9
投票

您无法将成员添加到类定义之外的类中。如果你想让D覆盖B::f,那么你必须在类定义中声明它。这些都是规则。

声明基类中的成员不会自动为派生类提供相同的成员。从基类继承为派生类提供基类的所有成员,因此您可以选择是否覆盖,隐藏或添加到基类成员,但是您必须通过声明覆盖函数来指示在类定义中覆盖的选项。


3
投票

即使D派生自B,因此您可以在D的实例上调用f(),但这并不意味着您不需要将声明放入标头中。

您实现的任何函数都必须在标头中显式声明。

但是,您不需要将其实现放在那里。只是

class D : public B
{
public:
   /*virtual*/ void f();
};

您可以选择是否在此处包含“虚拟”一词


1
投票

在C ++中,您的类定义告诉编译器该类实现了哪些函数。因此,如果要编写函数“D :: f()”,则必须在D的类定义中使用f()。

函数“B :: f()”已经在基类中定义的事实是无关紧要的。每个类定义必须显式声明它实现的函数。


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";
}
© www.soinside.com 2019 - 2024. All rights reserved.