Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 公共虚拟方法被重写为私有。一般化/专门化/Liskov原则违反?_C++_Oop_Solid Principles_Design Principles - Fatal编程技术网

C++ 公共虚拟方法被重写为私有。一般化/专门化/Liskov原则违反?

C++ 公共虚拟方法被重写为私有。一般化/专门化/Liskov原则违反?,c++,oop,solid-principles,design-principles,C++,Oop,Solid Principles,Design Principles,如中所示,可以编写以下代码: #include <iostream> class A { public: virtual void f() { std::cout << "A::f()"; } }; class B : public A { private: void f() override { std::cout << "B::f()"; } }; void g(A &g) { g.f(); } int main() { A a

如中所示,可以编写以下代码:

#include <iostream>

class A {
public:
  virtual void f() { std::cout << "A::f()"; }
};

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

void g(A &g) { g.f(); }

int main() {
  A a;
  g(a);
  a.f();
  B b;
  g(b);
  b.f(); // compilation failure
}
#包括
甲级{
公众:

虚空f(){ STD::CUT我不知道如何用私有的方法来覆盖公共虚拟方法。这在C++中是可能的,所以问题不是“如何”?但是为什么这是可能的?我确信,根据C++标准,可访问性不是成员函数签名的一部分。这就是为什么允许这样做的答案。我不确定我是否能回答这个标准是否应该允许它。好吧,但是这是一个技术性的争论。但是我想知道为什么,因为它非常奇怪……我不知道为什么它是这样设计的。值得注意的是,C++调用一个OOP语言是有点误导的。它是一个多范式语言,所以它不是O 100%设计的。OP范型。另外,我想我可以为它想出一个用例。你想在“B”中提供一个“f”的实现,但你不想让任何知道他们有一个“B”的人直接调用它。你想强迫他们总是通过基类句柄调用它,不管出于什么原因。显然,使用NVI将是一种更好的方法.