gpt4 book ai didi

c++ - 为什么我在使用 dynamic_cast 和模板时收到错误 "A is an inaccessible base of B"?

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

为什么对 f 的调用没有解析为第一个函数重载?我收到错误:

source.cpp: In function 'int main()':
source.cpp:12:31: error: 'A' is an inaccessible base of 'B'

class A {}; class B : A {};

void f(const A &) { std::cout << "const A &"; }
template <typename T> void f(T) { std::cout << "Generic"; }

int main() {

B b;

f(dynamic_cast<const A &>(b));

}

请注意,如果我取出 dynamic_cast,代码将起作用,但 second f 被调用(它打印“Generic”)。但我想做的是接到第一个电话。我认为 dynamic_cast 会起作用,但由于某种原因它会导致问题。我在这里做错了什么?

最佳答案

默认的类继承是私有(private)的(class B : A {}; 默认为 class B : private A {};)。

所以你不能通过类型A来处理b

编辑:正如 Rob 所说:),修复它的方法是使用公共(public)继承:

class B : public A {};

编辑:
public 派生类与其基类之间的关系是“是一个”,这意味着它是更通用类型的特化,因此,它实现了该通用类的行为,并且可能更多。

私有(private)派生类与其基类之间的关系是“根据...实现的”。它防止对象被视为基类的扩展。 boost::noncopyable 是使用它的一个很好的例子,它可以防止私有(private)派生类的对象被复制。 http://www.boost.org/doc/libs/1_52_0/libs/utility/utility.htm#Class_noncopyable

在假设情况下,要求包括私有(private)继承,并且在某个时候创建​​了一个函数,该函数想要引用该对象作为其基类,返回一个转换为基类指针的公共(public)方法 this 将这样做很像传统的 get() 访问私有(private)数据成员以保持原始目的。

public:
A *getBase() { return static_cast<A *>(this); }

然后像这样访问:

f(b.getBase());

关于c++ - 为什么我在使用 dynamic_cast 和模板时收到错误 "A is an inaccessible base of B"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13870020/

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