首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解纯虚函数

理解纯虚函数
EN

Stack Overflow用户
提问于 2015-06-28 12:53:14
回答 4查看 74关注 0票数 0

以下代码可以很好地编译:

代码语言:javascript
复制
struct A
{
    const int a;
    virtual void foo() = 0;
};

struct B : A{ };

void A::foo(){ std::cout << "foo" << std::endl; }

DEMO

问题是结构A是一个抽象的东西,所以我们不能实例化它。但我们可以将其子类化

代码语言:javascript
复制
struct A
{
    const int a;
    virtual void foo() = 0;
};

struct B : A{ };

void A::foo(){ std::cout << "foo" << std::endl; }

int main(int argc, char ** argv)
{
    B b;
    b.foo(); //error: implement pure-virtual
}

DEMO

仍然不能使用Afoo实现,我怀疑它永远不会被调用。所以,我不知道这种定义的应用……是的,提供一个虚拟析构函数的定义是有用的,但事实并非如此。

在哪里可以使用纯虚拟的定义?

EN

回答 4

Stack Overflow用户

发布于 2015-06-28 12:59:09

您可以显式调用它。

代码语言:javascript
复制
struct A
{
    const int a;
    virtual void foo() = 0;
};

struct B : A
{
    void foo();
};

void A::foo()
{
    std::cout << "A::foo" << std::endl;
}
void B::foo()
{
    A::foo(); // here
    std::cout << "B::foo" << std::endl;
}

int main(int argc, char ** argv)
{
    B b;
    b.foo(); // prints A::foo followed by B::foo
}
票数 3
EN

Stack Overflow用户

发布于 2015-06-28 12:57:59

您可以从B内部调用它。由于A::foo()是纯虚拟的,因此B需要定义foo:

代码语言:javascript
复制
struct A {
    virtual void foo() = 0;
};

void A::foo(){ std::cout << "A::foo() ran" << std::endl; }    

struct B : A {
    void foo() {
        A::foo(); // <--
        std::cout << "B::foo() ran" << std::endl;
    }
};

int main(int argc, char ** argv)
{
    B b;
    b.foo();
}
票数 2
EN

Stack Overflow用户

发布于 2015-06-28 13:00:13

但是您可以(而且必须)实现(如果B是可实例化的)A的void foo()的覆盖。该实现可以(但绝对不是必需的)调用基本实现:

代码语言:javascript
复制
struct B : public A
{
    virtual void foo() {A::foo();}
};

我已经实现了这个场景,其中我有一个非常简单的“基础”实现,但要求所有leafs通过链接回这个公共实现来积极地决定是否利用这个基础。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31096262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档