【发布时间】:2019-08-27 08:10:54
【问题描述】:
class B {
private:
friend class C;
B() = default;
};
class C : public B {};
class D : public B {};
int main() {
C {};
D {};
return 0;
}
我假设由于只有类C是B的朋友,并且B的构造函数是私有的,那么只有类C是有效的并且D不允许实例化B .但事实并非如此works。我的推理哪里错了,如何实现对允许哪些类继承某个基类的这种控制?
更新:正如 cmets 中的其他人所指出的那样,上面的 sn-p 按照我最初在 C++14 下的预期工作,但不是 C++17。在 main() 中将实例化更改为 C c; D d; 在 C++17 模式下也可以正常工作。
【问题讨论】:
-
@Diodacus:那又怎样,尽管在
private:部分中声明了私有构造函数,但将其声明为默认会使其公开? -
我收到了您期望的错误:“'D::D(void)': 试图引用已删除的函数”(msvs 2017)
-
@Stefan:我听到了,但是有两个类在语义上对
B的子类是有意义的,我正试图在 C++ 中表达/实施这个逻辑约束。跨度> -
我从未见过“恰好有两个类对子类 B 具有语义意义,而我正试图在 C++ 中表达/实施这种逻辑约束。”实际上在与未来的长期接触中幸存下来。一些未来的程序员,也许甚至你,会诅咒你没有看到他们明显需要另一个子类。
标签: c++ c++11 inheritance c++17