簡體   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