为什么调用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会工作,但由于某种原因它会导致问题.我在这做错了什么?
默认的类继承是私有的(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)
| 归档时间: |
|
| 查看次数: |
5391 次 |
| 最近记录: |