繁体   English   中英

为什么我不能在带有私有构造函数的c ++类中声明一个空的构造函数

[英]Why can't I declare an empty constructor in a c++ class that extends from one with a private constructor

我试图了解带继承的私有构造函数的用法(我对C ++还是很陌生),并且在测试中遇到了以下问题:

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

使用它来编译:g ++ -std = c ++ 11vestigial.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() {};
};

总结-为什么此代码无效?

谢谢!

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

但是,此基类没有默认构造函数,因此会出现错误消息。 注意,由于它是私有的,因此无论如何都无法调用Sample::Sample(string) ,因此实际上根本不可能从Sample派生。

如果您希望基类的构造函数只能由派生类调用,请改为对其进行protected

为什么代码无效?

调用者无法访问私有构造函数。


有几种方法可以调用私有基类构造函数。

  • 修改基类以将派生类命名为好友

  • 在基类中添加一个名为protected或public的构造函数,它可以调用派生的构造函数。 (命名的构造函数惯用方法是静态的)

  • 修改基类以将该函数命名为好友。

  • 修改私有构造函数以使其受到保护

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM