c++ - 私有(private)虚拟方法的用途是什么?

标签 c++ virtual-functions

这个问题在这里已经有了答案:





Private virtual method in C++

(5 个回答)


1年前关闭。




考虑下面的例子

#include <iostream>
#include <string>

class A
{
public:
    virtual void foo() { std::cout<< "FOO A\n"; }

private:
    void bar() { std::cout<< "BAR A\n"; }
    virtual void vbar() { std::cout<< "VBAR A\n"; }
};

class B : public A
{
public:
    void foo() { std::cout<< "FOO B\n"; bar(); vbar(); }
private:
    void bar() { std::cout<< "BAR B\n"; }
    virtual void vbar() { std::cout<< "VBAR B\n"; }
};

int main()
{
    A* b = new B();
    b->foo();
}


输出会给我们
FOO B
BAR B
VBAR B

由于我首先想到了它的简单示例,因此我无法弄清楚任何私有(private)虚拟方法用例。在公共(public)虚拟方法的情况下,基指针类接口(interface)将适应其定义的 vtable,但正如在给定的私有(private)虚拟示例中一样,这无关紧要

最佳答案

一种可能的用途是让基类定义一个结构,并让派生类实现所述结构的组件的行为(template method pattern)。例如,

struct foo
{
    void do_stuff() {
        // defines order in which some operations are executed
        do_op1();
        do_op1();
        do_op3();
    }
private:
     // These don't have to be pure virtual. A base,
     // default implementation could also be provided.
    virtual void do_op1() = 0;
    virtual void do_op2() = 0;
    virtual void do_op3() = 0;
};

// implements the operations
struct foo1 : foo
{
private:
    void do_op1() override { ... }
    void do_op2() override { ... }
    void do_op3() override { ... }
};

虚拟方法是私有(private)的,因为单独调用它们没有意义。基类知道何时以及如何调用它们。

在“现代 C++”中可能有更简单更好的实现方式,但这种事情在 90 年代和 00 年代可能已经出现。

关于c++ - 私有(private)虚拟方法的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61923656/

相关文章:

c++ - 函数参数不是左值?

c++ - 棘手的多态性和虚函数

c++ - 如果没有显式限定名称,如何调用纯虚函数?

c++ - 有没有办法摆脱虚拟成员函数的常量

c++ - 构建过程中的虚拟函数调用

c++ - GCC 5.3.1 C++ 在编译 Variadic 模板时停止

c++ - 如何使用 Casablanca 在现有的 web::json::value 对象中附加新的键值对?

c++ - 为什么 C+ +'s <vector> templated class doesn' t 打破了一个定义规则?

c++ - 是否可以获得指向纯虚函数定义的指针?

c++ - 我们可以有像 map<string,pair<string,list>> 这样的数据结构吗?