Наследование и конструкторы с++
Изучаю с++, не могу понять как использовать наследование конструкторов. Пытаюсь вызвать конструктор родительского класса и передать туда параметры, но среда разработки ругается. Почему- не могу понять. Искал в интернете примеры похожие, но ничего связанного с моим случаем не нашёл (имею в виду случай, когда используется отделение реализации с помощью cpp и h файлов). Вот сам код:
File.h
#pragma once
#include <string>
class File
{
private:
std::string name;
std::string magic;
std::string hash;
std::string owner;
std::string system;
std::string date_changed;
std::string date_created;
std::string format;
std::string type;
float size;
File(std::string magic, std::string format);
};
File.cpp с реализацией конструктора
#include "File.h"
#include <string>
File::File(std::string magic, std::string format) {
this->magic = magic;
this->format = format;
};
файл Zip.h
#pragma once
#include "File.h"
class Zip :
public File
{
public:
int number_of_files_inside;
Zip() : File("504b0304", "zip");
};
файл Zip.cpp
#include "Zip.h"
Zip::Zip() :File("504b0304", "zip") {}
Ответы (2 шт):
Ты пытаешься дважды сделать реализацию конструктора Zip.
это не валидный код.
Zip() : File("504b0304", "zip");
так как в конструкторе код после : относится к реализации, а не объявлению
У вас два раза вызывается конструктор предка - в declaration и в definition вашего конструктора потомка. Два раза - нельзя, один раз - достаточно.
File.h
Сделаем конструктор из приватного в протектед для всех наследников.
#pragma once
#include <string>
class File
{
private:
std::string name;
std::string magic;
std::string hash;
std::string owner;
std::string system;
std::string date_changed;
std::string date_created;
std::string format;
std::string type;
float size;
protected:
File(std::string magic, std::string format);
};
Zip.h
Так как конструктор пустой, сделаем его inline в теле класса и сразу скажем какой конструктор предка вызывать.
#pragma once
#include "File.h"
class Zip :
public File
{
public:
int number_of_files_inside;
Zip() : File("504b0304", "zip") {}
};
Zip.cpp
Здесь ничего не надо уже.
#include "Zip.h"