gpt4 book ai didi

c++ - 对于私有(private)继承,什么时候可以向上转型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:32 25 4
gpt4 key购买 nike

我有一个关于 C++ 的私有(private)继承的问题。请参见以下代码示例:

#include <iostream>

class Foo {
public:
virtual void doSomething(int value) {
std::cout << value << std::endl;
}

};

void foobar(Foo& foo, int value) {
foo.doSomething(value);
}

class Bar : Foo {
public:
Bar() {
foobar(*this, 42); // <--- is OK despite private inheritance
}
};

int main() {
Bar b;
foobar(b, 42); // <--- is NOT OK because of private inheritance
}

目前,我不明白(或找不到正确的 C++ 规范)为什么可以在 Bar 的构造函数中使用 调用函数 foobar >*this 尽管是私有(private)继承。如果我尝试在 main 函数中使用 Bar 对象 b 调用 foobar 函数,编译器会给出错误正如预期的那样,因为私有(private)继承。

我忽略的 foobar(*this, 42)foobar(b, 42) 之间有什么区别?

最佳答案

这一切都是因为 foobar 接收到一个 Foo 并且不知道 Bar (私下)继承自 >富。这个特性由调用者处理:

  • Bar 的构造函数中,为了使用 *this 调用 foobar,需要进行转换;具体来说,类型为 Bar*this 需要转换为 Foo&,这是可能的,因为调用者知道两种类型之间的继承关系。
  • main() 中,在 class Bar 作用域之外,使用 b 调用 foobarBar 类型也需要转换。但在此上下文中,BarFoo 之间的关系是未知的,并且没有转换的可能。

私有(private)继承意味着只有派生类型知道这种继承。在其范围内,一切都发生,就好像它是公共(public)继承一样。但在派生类型的范围之外,这种关系是未知的,一切都发生了,就好像根本没有继承一样。

关于c++ - 对于私有(private)继承,什么时候可以向上转型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49208173/

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