- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
嵌套类 Foo::Utility
可以访问另一个嵌套类 Foo::Container
,即使后者是私有(private)的。我正在尝试将此访问权限扩展到 Foo::Utility
的多态版本 UtilityPrint
但没有成功:
class Foo {
private:
class Container {};
public:
class Utility {
public:
virtual void action(Container &) = 0;
// works even if Container is private
};
Container container;
Utility * utility;
Foo(Utility * utility): container(), utility(utility) {};
void performAction() {
utility -> action(container);
}
};
// polymorphic nested class
// failed attempt
class UtilityPrint : Foo::Utility {
public:
virtual void action(Foo::Container &) {
/* Implementation */
// this does not work, because Foo::Container is private
}
};
是否有实现此目标的正确方法,或者从一开始就不是一个好主意?
我得到的错误信息是这样的:
error: ‘class Foo::Container’ is private
class Container {};
^
error: within this context
virtual void action(Foo::Container &) {
此外,这是我使用这种有点奇怪的设计的原因:我想要一个 container
和一个对容器和 Foo
都起作用的多态 utility
。由于 container
和 utility
只会在 Foo
的上下文中使用,所以我将这两个类放入 Foo
.
编辑:我可以将派生的 Utility
包装在派生的 Foo
中,然后代码编译:
class Foo {
protected:
class Container {};
public:
class Utility {
public:
virtual void action(Container &) = 0;
};
Container container;
Utility * utility;
Foo(Utility * utility): container(), utility(utility) {};
void performAction() {
utility -> action(container);
}
};
class FooPrint : public Foo {
public:
class Utility : Foo::Utility {
public:
virtual void action(Foo::Container &) {
/* Implementation */
}
};
};
然而,这引入了一个包装类 FooPrint
,它仅出于句法原因而存在,并且(作为派生类!)永远不会被实例化。由于这个原因,我不喜欢这种方法,但在这方面我可能会大错特错。
最佳答案
访问权限不可继承。这在讨论 friends 时更常被提及。 , 但它也适用于此。
首先我们来看一下为什么Foo::Utility::action
可以访问私有(private)类Foo::Container
。实际上,它就在名字中。 Foo::Container
只能被Foo
的成员访问,Foo
的成员写出他们的限定名和该名称以“Foo::
”开头。
相比之下,UtilityPrint
不是Foo
的成员。 (事实上 ,如果有人可以简单地说 “哦,是的,我也是成员(member)! 并访问您的私有(private)信息,这将是一个巨大的安全违规行为。)所以虽然 UtilityPrint
可以( protected )访问 Foo::Utility
,它无法访问 Foo::Utility
可以访问的所有内容。
如果 Foo::Utility
希望扩展对从它派生的类的访问,则需要显式地这样做。一种方法是创建别名。
class Utility {
protected:
using Container = Foo::Container; // Derived classes can access this.
public:
virtual void action(Container &) = 0;
virtual ~Utility() {} // <-- remember to properly support polymorphism
};
这仍然悬而未决,这是否是一个好的设计。我会认为这是一个警告标志,表明可能存在某些问题,但并非最终如此。这个问题没有足够的背景让我做出这样的决定。我只想给你一个指导方针,如果你觉得你正在规避很多语言功能(比如私有(private)访问),那么也许设计需要工作。
关于c++ - 无法从多态嵌套类访问包含类的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58140892/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!