为什么对 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/