【发布时间】:2014-03-20 13:48:27
【问题描述】:
使用这个层次结构:
struct TestBase {
// Constructor
TestBase();
TestBase(int a);
TestBase(TestBase const &testBase);
// Destructor
virtual ~TestBase();
};
struct TestChild : public TestBase {
// Constructor inheritance
using TestBase::TestBase;
};
有了这个测试代码:
TestBase testBase; // 1) Custom constructor
TestChild testChild; // 2) Default constructor created by the compiler
TestChild testChild2(1); // 3) Inherited from parent with 'using' keyword
TestChild testChild3(testChild); // 4) Default copy constructor created by the compiler ?
TestChild testChild4(testBase); // 5) Doesn't work, why it doesn't inherit ?
首先我认为在测试4中复制构造函数是从TestBase继承的(通过'using'关键字)但实际上这是因为编译器生成了一个调用父类的复制构造函数的默认复制构造函数,是否正确?
复制构造函数不能被继承,因为它必须与类具有相同的参数类型,是否也正确?
但是为什么测试 5 不能编译?它不是 TestChild 类的复制构造函数,所以它必须被继承,不是吗?
这是错误信息:
foo.cpp: In function ‘int main()’:
foo.cpp:21:34: error: no matching function for call to ‘TestChild::TestChild(TestBase&)’
TestChild testChild4(testBase); // 5) Doesn't work, why it doesn't inherit ?
^
foo.cpp:21:34: note: candidates are:
foo.cpp:11:12: note: TestChild::TestChild()
struct TestChild : public TestBase {
^
foo.cpp:11:12: note: candidate expects 0 arguments, 1 provided
foo.cpp:13:25: note: TestChild::TestChild(int)
using TestBase::TestBase;
^
foo.cpp:13:25: note: no known conversion for argument 1 from ‘TestBase’ to ‘int’
foo.cpp:11:12: note: TestChild::TestChild(const TestChild&)
struct TestChild : public TestBase {
^
foo.cpp:11:12: note: no known conversion for argument 1 from ‘TestBase’ to ‘const TestChild&’
foo.cpp:11:12: note: TestChild::TestChild(TestChild&&)
foo.cpp:11:12: note: no known conversion for argument 1 from ‘TestBase’ to ‘TestChild&&’
【问题讨论】:
-
如果测试 5 出现编译错误,那么错误消息应该是问题的一部分。
-
我认为它与:stackoverflow.com/questions/20435859/…(见接受的答案)有关
标签: c++ inheritance c++11