Как наследовать от класса, который был объявлен заранее - PullRequest
1 голос
/ 09 ноября 2019

Я объявил классы: Another и Klass. класс Another определен только в another.hpp, класс Klass объявлен в klass.hpp и определен в klass.cpp.

Я включил another.hpp внутри klass.cpp и класс, объявленный заранееAnother в klass.hpp.

// klass.cpp
#include "klass.hpp"
#include "another.hpp"

Klass::Klass()
{

}

// klass.hpp
#pragma once

class Another;

class Klass : public Another
{
public:
    Klass();
};

// another.hpp
#pragma once

class Another
{
protected:
    int a;
    char b;
};

1 Ответ

1 голос
/ 09 ноября 2019

В вашем файле klass.hpp:

#pragma once

class Another;

class Klass : public Another
{
public:
    Klass();
};

class Another; - это предварительное объявление: оно просто вводит имя Another в область видимости C ++. Это предварительное объявление просто включает частичную классификацию имени Another (то есть, что оно относится к классу). Он не предоставляет всех деталей для создания полной декларации (например, он не дает деталей для определения его размера).

Таким образом, Another выше является неполным типом и его размер неизвестен компилятору. Следовательно, вы не можете предоставить определение класса Klass, унаследовав от Another, неполный тип. Если бы вы могли, какой тогда должен быть размер Klass?.

...