gpt4 book ai didi

c++ - 在 C++ 中调用来自世界的私有(private)方法

转载 作者:行者123 更新时间:2023-11-30 01:20:52 24 4
gpt4 key购买 nike

我真的不明白为什么它会起作用,但下面的代码显示了一个在没有任何友元类的情况下从世界调用私有(private)方法的示例:

class A
{
public:
virtual void someMethod(){
std::cout << "A::someMethod";
}
};
class B : public A
{
private:
virtual void someMethod(){
std::cout << "B::someMethod";
}
};
int main(){
A* a = new B;
a->someMethod();
}

输出:

B::someMethod

这不是违反了C++中的封装规则吗?对我来说,这太疯狂了。继承是public的,但是派生类中的访问修饰符改为private,因此B类中的someMethod()是private的。所以实际上,在执行 a->someMethod() 时,我们是直接从世界中调用一个私有(private)方法。

最佳答案

考虑以下代码,对原始问题中的代码进行修改:

class A
{
public:
virtual void X(){
std::cout << "A::someMethod";
}
};
class B : public A
{
private:
virtual void Y(){
std::cout << "B::someMethod";
}
};
int main(){
A* a = new B;
a->X();
}

很容易理解调用X()是合法的。 B 作为公共(public)成员从 A 继承它。理论上,如果 X() 调用 Y(),这当然也是合法的,尽管这是不可能的,因为 X() 是在不知道 Y() 的 A 中声明的。但实际上如果 X = Y 就是这种情况,即如果两种方法具有相同的名称。

您可能认为它是“B 从 A 继承了一个公共(public)方法,该方法调用了一个(B 的)具有相同名称的私有(private)方法”。

关于c++ - 在 C++ 中调用来自世界的私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18865500/

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