gpt4 book ai didi

c++11 - 是否有私有(private)公共(public)虚拟方法的用例?

转载 作者:行者123 更新时间:2023-12-04 14:40:50 25 4
gpt4 key购买 nike

#include <iostream>

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

struct B : public A
{
private:
void foo() override { std::cout << "B"; }
};

int main()
{
A *p = new B;
p->foo(); // prints B

// B b;
// b.foo(); // error: foo is private
return 0;
}

// g++ -std=c++11 -Wall -Wextra -Wpedantic main.cpp && ./a.out

所以我们可以调用 B.foo()多态的,但不是直接的。当有人想要使用此功能时,是否有任何用例?

最佳答案

这有点取决于基类的设计。假设你有一个基类

class Stream {
public:
virtual bool canSeek() = 0;
virtual void seek(int offset) = 0;
};

注意:此示例来自 .NET 世界,其中基类库 Stream类真的有这么一个虚拟 CanSeek属性(property)。我不想讨论这是否是好的设计,因为我可以看到双方的有效论据。现实中存在这样的基类就足够了。

现在,派生类可以指定
class SpecificStream final : Stream {
private:
virtual bool canSeek() { return false; }
virtual void seek(int offset) { throw "no seek for you"; }
}

在这个派生类中, seek完全实现是因为它在技术上是必需的。但是,任何处理此 SpecificStream 的代码已经知道 seek函数对这个类完全没用,不应该被调用。对基础 Stream 进行编码时类,检查 canSeek() 可能有意义的结果并调用 seek仅当结果为真时。根据 SpecificStream 编码时类,检查 canSeek() 没有意义,因为它的结果是静态已知的,调用 seek() 绝对没有意义.如果此类调用是程序员错误,那么帮助编译器为此类调用提供有用的消息是有意义的。

关于c++11 - 是否有私有(private)公共(public)虚拟方法的用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40635064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com