使用dynamic_cast和模板时,为什么会出现错误"A是B的无法访问的基础"?

tem*_*boy 5 c++

为什么调用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));

}
Run Code Online (Sandbox Code Playgroud)

请注意,如果我取出dynamic_cast代码将工作,第二个 f被调用(它打印"通用").但我要做的就是第一次打电话.我认为它dynamic_cast会工作,但由于某种原因它会导致问题.我在这做错了什么?

imr*_*eal 8

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

所以你无法b通过类型来处理A.

编辑:像Rob说:),修复它的方法是使用公共继承:

class B : public A {};
Run Code Online (Sandbox Code Playgroud)

编辑:公共派生类与其基类
之间的关系是"是一个",这意味着它是更通用类型的特化,因此,它实现了该泛型类的行为,可能还有更多.

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

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

public:
    A *getBase() { return static_cast<A *>(this); }
Run Code Online (Sandbox Code Playgroud)

然后像这样访问:

f(b.getBase());
Run Code Online (Sandbox Code Playgroud)

  • 解决方案是'B类:公共A {};` (2认同)