2017-01-14 6 views
3

У меня есть небольшая проблема с этим кодом:Наследование C++ приведение к базовому типу

#include <iostream> 

class A { 
public: 
    void PrintA() { 
     std::cout << "A"; 
    } 
}; 

class B : public A { 
public: 
    void PrintB() { 
     std::cout << "B"; 
    } 
}; 

int main() { 

    A a; 
    a.PrintA(); 

    B b; 
    b.PrintA(); 
    b.PrintB(); 


    system("PAUSE"); 
} 

Можете ли вы сказать мне, если существует способ определить в классе объект B и использовать его методы что-то вроде:

class A { 
public: 
    void PrintA() { 
     std::cout << "A"; 
    } 

    B bclass; 
}; 

А использование в основной функции что-то вроде:

int main() { 

    A a; 
    a.bclass->PrintB(); 

    system("PAUSE"); 
} 
+1

Нет, A не может содержать объект B, потому что B является производным от A, но может содержать указатель на один. –

+0

Можете ли вы дать мне пример, пожалуйста, я пытаюсь найти в Google некоторые, но ничего не понимаю ... Как сделать этот указатель? – zVoxty

+0

Здесь вы найдете множество примеров использования указателей: http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list –

ответ

3

вопрос, который вы должны задать себе

Как фигурку компилятор из размера A

Ну - Необходимо выяснить размер B

Но B имеет в нем A.

Вы можете пойти вокруг этого цикла навсегда

Таким образом, вы не можете это сделать.

Так используйте указатель и опережающее объявление

+0

Я пытаюсь сделать что-то вроде B * bclass = new B, но он говорит undefined тип b. PS: Теперь я использую форвардную декларацию. – zVoxty

+0

@zVoxty. Скорее всего, потому, что B еще не определен, когда A определяется. Как писал Эд Хил, вам нужно переслать декларации, чтобы указать, что B существует и будет определено позже. – synchronizer

+0

То, что вы только что сказали, касается наследования. Не существует 'class A: public B {}' с классом B: public A {} '. Но, кажется, автору не нужен такой замкнутый граф рекурсии. – oklas

0

Обычно функционирующее определение помещается в cpp файлах и определение класса в h или hpp файлов.

В cpp файлах вы включаете оба hpp с обоими классами.

Каждая функция, определенная в cpp, имеет вид определения обоих классов и может создать новую из них.

Но в декларации вы можете использовать указатель или ссылку на объект этого класса.

== a.hpp ==

#pragma once 

class B; 
class A { 
public: 
    void PrintA(); 
    B* b; 
}; 

== b.hpp ==

#pragma once 

#include "a.hpp" 

class B : public A { 
public: 
    void PrintB(); 
    A* a; 
}; 

== a.cpp ==

#include "a.hpp" 
#include "b.hpp" 

void A::PrintA() { 
    b = new B(); 
    std::cout << "A"; 
} 

== б. cpp ==

#include "a.hpp" 
#include "b.hpp" 

void B::PrintB() { 
    a = new A(); 
    std::cout << "A"; 
} 

А главное:

int main() { 

    A a; 
    a.PrintA(); 
    a.b->PrintB(); 

    B b; 
    b.PrintA(); 
    b.PrintB(); 


    system("PAUSE"); 
} 

Практический пример доступен в this link все в одном файле.

Там one else link где кажется используемым компилятором Visual Studio.

+0

Это не имеет никакого отношения к вопросу ОП. –

+0

Почему? OP спросите, как 'a.bclass-> PrintB()', и мой пример показывает его 'a.b-> PrintB()'. Уточните пожалуйста. – oklas

+0

Я пробую ваш код и сказал использование неопределенного типа B – zVoxty

-1

Просто для образца, вы можете указать к экземпляру B из A, например, как показано ниже, с указателем:

class A { 
public: 
    void PrintA() { 
     std::cout << "A"; 
    } 

    std::unique_ptr<B> bclass; 
}; 

A a; 
A.bclass=new B; 
A.bclass->PrintB(); 

Уникальный указатель будет управлять освобождением памяти.

+0

Не будет работать без какой-либо записи объявления B. –

+0

Это то, что я не могу сделать. A.bclass = new B A.bclass-> PrintB() Это работает – zVoxty

+0

Нет, это не сработает, если я объявляю указатель как: B * bclass = new B; в классе А; Это то, что мне нужно объявить и определить указатель B в классе A: -? – zVoxty

Смежные вопросы