私有虚拟方法有什么用?
Whats the usage of private virtual methods?
考虑以下示例
#include <iostream>
#include <string>
class A
{
public:
virtual void foo() { std::cout<< "FOO An"; }
private:
void bar() { std::cout<< "BAR An"; }
virtual void vbar() { std::cout<< "VBAR An"; }
};
class B : public A
{
public:
void foo() { std::cout<< "FOO Bn"; bar(); vbar(); }
private:
void bar() { std::cout<< "BAR Bn"; }
virtual void vbar() { std::cout<< "VBAR Bn"; }
};
int main()
{
A* b = new B();
b->foo();
}
输出将给我们
FOO B
BAR B
VBAR B
由于我想到了它的第一个简单示例,因此我无法弄清楚任何私有虚拟方法用例。在公共虚拟方法的情况下,基指针类接口将适应其定义的 vtable,但正如私有虚拟的给定示例一样,这并不重要
一种可能的用途是让基类定义结构,并让派生类实现所述结构组件的行为(模板方法模式(。例如
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 { ... }
};
虚拟方法是私有的,因为单独调用它们是没有意义的。基类知道何时以及如何调用它们。
在"现代C++"中可能有更简单更好的实现方法,但这种事情可能在 90 年代和 00 年代就已经看到过。
在某些情况下,有些人认为,如果可能的话,它应该是首选方法,比如 Herb Sutter:
准则#2:更喜欢将虚拟函数设为私有。
。这允许派生类重写函数以根据需要自定义行为,而无需通过使虚拟函数可由派生类调用来直接公开虚拟函数(如果函数只是受到保护,这是可能的(。关键是存在虚拟功能以允许自定义;除非它们还需要直接从派生类的代码中调用,否则没有必要将它们设为私有。但有时我们确实需要调用虚拟函数的基本版本(参见文章"VirtualYours"[5]的例子(,在这种情况下,只有保护这些虚拟函数才有意义,因此:
准则 #3:仅当派生类需要调用虚函数的基本实现时,才使虚拟函数受到保护......
http://www.gotw.ca/publications/mill18.htm
相关文章:
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 有什么方法可以将元素添加到列表中,如图所示?
- 有什么方法可以将具有不同模板参数的模板类实例放入向量中?
- 通常使用什么方法来检测时间情况?
- 有什么方法可以包装自动类型扣除的助推"tee"流的构造?
- 有什么方法可以使用 int 变量来完成组件名称吗?
- C++ - 有什么方法可以将输入插入缓冲区/停止 cin.忽略需要输入?
- 有什么方法可以在标头中定义和声明 extern 对象吗?
- 终端进程终止,退出代码为:1有什么方法可以修复它吗
- 有什么方法可以从不同函数的变量中检索值吗?c++
- 有什么方法可以检测我的类的对象是否在堆栈上创建
- 当矢量改变容量时,有什么方法可以更新指针/参考值
- 计算机使用什么方法添加无符号整数
- 有什么方法可以延长C++中临时对象的生存期吗
- 有什么方法可以识别可用的内存地址吗?
- 有什么方法可以在 c++ 中组织"cycling"(循环)数字?
- 有什么方法可以"factor out"公共字段以节省空间?