Наследование C++ и включает в себя
Я не новичок в C++, однако я также определенно не эксперт... и все же:)
Я пытаюсь понять, как работает наследование. У меня есть класс, производный от базового класса:
class Base {}
И
#include "Base.h"
class Derived : public Base {}
В моем базовом классе я пытаюсь создать статический метод, который возвращает указатель на производный объект класса:
#include "Derived.h"
class Base {
static Derived* getDerived();
}
Теперь я думал, что, поскольку это был статический член, я мог бы выйти сухим из воды, но я получаю проблемы со временем компиляции, жалуясь, что Производный класс не знает, что такое базовый объект, хотя я включаю Base.h в производном классе. Я также знаю о циклической зависимости,однако, поскольку я пытаюсь вернуть указатель на объект, я решил, что компилятор не будет нуждаться в производном #include.h", но кажется, что это так.
Любое направление, почему это не тот путь, и что я мог бы сделать вместо этого, было бы очень ценно!
(в настоящее время я делаю это на Java)
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; }
Это круговые ссылки.
Чтобы использовать Class-Base, необходимо знать Class-Derived, поскольку он содержит статическую функцию с типом возвращаемого значения Class-Derived.
Чтобы использовать класс-производный, вам нужно знать Class-Base, потому что он является производным от Class-Base
Comments