Наследование C++ и включает в себя



Я не новичок в C++, однако я также определенно не эксперт... и все же:)



Я пытаюсь понять, как работает наследование. У меня есть класс, производный от базового класса:

class Base {}


И



#include "Base.h"
class Derived : public Base {}


В моем базовом классе я пытаюсь создать статический метод, который возвращает указатель на производный объект класса:



#include "Derived.h"
class Base {
static Derived* getDerived();
}


Теперь я думал, что, поскольку это был статический член, я мог бы выйти сухим из воды, но я получаю проблемы со временем компиляции, жалуясь, что Производный класс не знает, что такое базовый объект, хотя я включаю Base.h в производном классе. Я также знаю о циклической зависимости,однако, поскольку я пытаюсь вернуть указатель на объект, я решил, что компилятор не будет нуждаться в производном #include.h", но кажется, что это так.



Любое направление, почему это не тот путь, и что я мог бы сделать вместо этого, было бы очень ценно!



(в настоящее время я делаю это на Java)

543   3  

3 ответов:

Да, в вашем случае(просто верните указатель на объект) компилятору не понадобится #include "Derived.h", ему просто нужно прямое объявление:

class Derived;
class Base {
     static Derived* getDerived();
};

Демо: http://ideone.com/ONUHGc

Следующий код отвечает на ваш вопрос, но я не знаю, почему вы хотите сделать это на всех.

Мне кажется, что смысл вашего базового класса состоит в том, чтобы обеспечить интерфейс, достаточный для ваших нужд, и как таковой работает без знания производных типов .

База.h

#ifndef BASE_H
#define BASE_H

class Derived; // Forward declaration to avoid including 'Derived.h'

class Base
{
public:
    virtual ~Base() {}

    // Non-static function so that it has access to 'this'
    Derived* getDerived();
};

#endif

База.cpp

#include "Base.h"

#include "Derived.h"

Derived* Base::getDerived()
{
    return dynamic_cast<Derived*>(this);
}

Выведено.h

#ifndef DERIVED_H
#define DERIVED_H

#include "Base.h"

class Derived : public Base
{
public:
    virtual ~Derived() override {}
};

#endif

Главная.cpp

#include "Derived.h"

#include <iostream>

int main()
{
    Derived d;
    Base* b = &d;

    std::cout << &d << " : " << b->getDerived() << "\n";

    return 0;
}

Это круговые ссылки.

  1. Чтобы использовать Class-Base, необходимо знать Class-Derived, поскольку он содержит статическую функцию с типом возвращаемого значения Class-Derived.

  2. Чтобы использовать класс-производный, вам нужно знать Class-Base, потому что он является производным от Class-Base

Comments

    Ничего не найдено.