为什么这个代码:
class A
{
public:
explicit A(int x) {}
};
class B: public A
{
};
int main(void)
{
B *b = new B(5);
delete b;
}
导致以下错误:
main.cpp: In function ‘int main()’:
main.cpp:13: error: no matching function for call to ‘B::B(int)’
main.cpp:8: note: candidates are: B::B()
main.cpp:8: note: B::B(const B&)
B不应该继承A的构造函数吗?
(这是使用gcc)
如果你的编译器支持c++ 11标准,有一个构造函数继承使用using(双关语)。有关更多信息,请参阅维基百科c++ 11文章。你写的:
class A
{
public:
explicit A(int x) {}
};
class B: public A
{
using A::A;
};
这是全有或全无——你不能只继承一些构造函数,如果你这样写,你就继承了所有的构造函数。要只继承选定的构造函数,您需要手动编写各个构造函数,并根据需要从它们调用基构造函数。
从历史上看,c++ 03标准中不能继承构造函数。您需要通过自己调用基本实现来逐个手动继承它们。
对于模板化基类,请参考以下示例:
using std::vector;
template<class T>
class my_vector : public vector<T> {
public:
using vector<T>::vector; ///Takes all vector's constructors
/* */
};
如果你的编译器支持c++ 11标准,有一个构造函数继承使用using(双关语)。有关更多信息,请参阅维基百科c++ 11文章。你写的:
class A
{
public:
explicit A(int x) {}
};
class B: public A
{
using A::A;
};
这是全有或全无——你不能只继承一些构造函数,如果你这样写,你就继承了所有的构造函数。要只继承选定的构造函数,您需要手动编写各个构造函数,并根据需要从它们调用基构造函数。
从历史上看,c++ 03标准中不能继承构造函数。您需要通过自己调用基本实现来逐个手动继承它们。
对于模板化基类,请参考以下示例:
using std::vector;
template<class T>
class my_vector : public vector<T> {
public:
using vector<T>::vector; ///Takes all vector's constructors
/* */
};