gpt4 book ai didi

c++ - 无法从多态嵌套类访问包含类的成员

转载 作者:行者123 更新时间:2023-11-28 04:09:23 25 4
gpt4 key购买 nike

嵌套类 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。由于 containerutility 只会在 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/

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