为什么打电话给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
会起作用,但由于某种原因它会引起问题。我在这里做错了什么?
默认类继承是私有的(class B : A {};
默认为class B : private A {};
).
所以你无法处理b
通过型A
.
编辑:
就像 Rob 所说的:),解决这个问题的方法是使用公共继承:
class B : public A {};
EDIT:
之间的关系publicly派生类及其基类是“is a”,这意味着它是更通用类型的特化,因此,它实现了该通用类的行为,甚至可能更多。
之间的关系私下里派生类及其基类是“实现的”。它防止对象被视为基类的扩展。其使用的一个很好的例子是boost::noncopyable
防止复制私有派生类的对象。http://www.boost.org/doc/libs/1_52_0/libs/utility/utility.htm#Class_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); }
然后像这样访问:
f(b.getBase());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)