为什么我不能在c ++类中声明一个空构造函数,该类从具有私有构造函数的类扩展

Cat*_*yst 0 c++ inheritance c++11

我试图了解具有继承的私有构造函数的用法(我对C++相当新)并且在测试中遇到了以下问题:

vestigial.cc: In constructor ‘ExtraSample::ExtraSample()’:
vestigial.cc:34:16: error: no matching function for call to ‘Sample::Sample()’
  ExtraSample() {};
Run Code Online (Sandbox Code Playgroud)

使用它来编译: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() {};
};
Run Code Online (Sandbox Code Playgroud)

总之 - 为什么这段代码无效?

谢谢!

Bri*_*ian 7

初始化派生类时,必须首先初始化基类.您可以通过在派生类构造函数中的ctor-initializer中提及基类的名称来指定要调用的基类构造函数.如果没有明确指定,那么编译器会尝试调用基类的默认构造函数.

但是,此基类没有默认构造函数,因此出现错误消息.请注意,Sample::Sample(string)无论如何你都无法打电话,因为它是私人的,因此根本无法从中获取Sample.

如果您希望基类的构造函数只能由派生类调用,请protected改为使用它!