我试图了解具有继承的私有构造函数的用法(我对C ++来说相当新),并且在测试中遇到了以下问题:
vestigial.cc: In constructor ‘ExtraSample::ExtraSample()’:
vestigial.cc:34:16: error: no matching function for call to ‘Sample::Sample()’
ExtraSample() {};
使用它来编译:g ++ -std = c ++ 11 vestigial.cc
这是代码:
#include <iostream>
#include <memory>
#include <string>
#include <vector>
using namespace std;
class Sample {
public:
~Sample(){
cout << name << " died " << endl;
};
void what() {
cout << name << " hat" << endl;
}
private:
Sample(const string n) {
name = n;
};
friend class SampleOwner;
string name;
};
class SampleOwner {
public:
static Sample* createSample(const string n) {
return new Sample(n);
}
};
class ExtraSample : Sample {
public:
private:
ExtraSample() {};
};
总结一下 - 为什么这段代码无效?
谢谢!
答案 0 :(得分:7)
初始化派生类时,必须首先初始化基类。您可以通过在派生类构造函数中的ctor-initializer中提及基类的名称来指定要调用的基类构造函数。如果没有明确指定,那么编译器会尝试调用基类的默认构造函数。
但是,此基类没有默认构造函数,因此出现错误消息。请注意,您无论如何都无法调用Sample::Sample(string)
,因为它是私有的,因此根本无法从Sample
派生。
如果希望基类的构造函数只能由派生类调用,请改为使用protected
!
答案 1 :(得分:2)
为什么代码无效?
调用者无法访问私有构造函数。
有几种方法可以调用私有基类构造函数。
修改基类以将派生类命名为朋友
将命名构造函数添加到基类中作为protected或public,并且可以调用派生构造函数。 (命名的构造函数idiom方法是静态的)
修改基类以将该函数命名为朋友。
修改要保护的私有构造函数