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

标签 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));

}

请注意,如果我取出 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/

相关文章:

c++ - 整数对 vector 到整数 vector vector

c++ - 多个序列上的 runAction

c++ - 如何忽略 gcov 输出中的头文件?

c++ - OpenCV 错误 : Assertion failed (vc_. isOpened()) 复位

c++ - 从 nodejs 模块初始化函数报告失败

c++ - 串口编程中的PNP(Plug and Play)事件处理

c++ - 现代 C++ 编译器是否能够避免在某些情况下两次调用 const 函数?

c++ - 如何调整属于某个类的唯一指针的 char 数组的大小。它必须在程序的整个生命周期中保持事件状态

c++ - 为什么 boost::filesystem::path 返回路径而不是字符串

c++ - Qt invokeMethod 和调用静态方法?