2015-02-19 2 views
1

Как я могу получить свой базовый указатель для создания производного объекта и использования его функций? Есть ли способ набирать текст как java? Рассмотрим этот пример кода:с использованием базового указателя для использования функций производных объектов

int main(){ 
    cBase *pBase = 0; 
    if (1 < 2) 
    { 
     pBase = new cDerived; 
    } 
} 

class cBase 
{public: 
    virtual void printMe() 
      { 
      std::cout << "printed cBase" << endl; 
      } 
}; 

class cDerived: public cBase 
{public: 
    virtual void printMe() 
     { 
      std:: cout << "printed cDerived" << endl; 
      } 
}; 

Однако, когда я это сделать; это дает мне ошибку «Выражение должно иметь тип класса».

cBase *pBase = 0; 
    if (1 < 2) 
    { 
     pBase = new cDerived; 
     pBase.printMe(); 
    } 
+1

Где твое определение cBase? –

+0

Нужно ли это? я просто сделал этот пример до –

+1

'pBase.printMe();' ===> 'pBase-> printMe();' и 'printMe()' лучше быть членом (виртуальным или иным) 'cBase'. – WhozCraig

ответ

1

Fix это так

#include <iostream> 
using namespace std; 

class cBase 
{ 
    public: 
     virtual ~cBase() {}; 
     virtual void printMe() 
     { 
     std::cout << "printed cBase" << endl; 
     } 
}; 

class cDerived: public cBase 
{public: 
    virtual void printMe() 
     { 
      std:: cout << "printed cDerived" << endl; 
      } 
}; 

int main(){ 
    cBase *pBase = 0; 
    if (1 < 2) 
    { 
     pBase = new cDerived; 
     pBase->printMe(); 
     delete pBase; 
    } 
} 

шаги, чтобы исправить.

  1. Move main функции после объявления cBase и cDerived классов или вперед объявить эти классы перед тем main.

  2. Изменить pBase.printMe()pBase->printMe(). Поскольку pBase - это указатель, вы должны разыменовать его перед доступом к его членам. pBase->printMe() подобно стенографии для (*pBase).printMe()

Плюс несколько других битов домашнего хозяйства. Удалите объект pBase, и поскольку вы удаляете производный класс (cDerived) с помощью указателя на базовый класс (cBase), вы должны объявить виртуальный дескриптор базовых классов или вызывается деструктор cBase, когда pBase удаляется, когда вы действительно хотите, чтобы cDerived Здесь вызывается деструктор.

+0

http://www.learncpp.com/cpp-tutorial/125-the-virtual-table/ –

0

В C++ для того, чтобы перейти к методу/поле указателя на класс/структуру, вам необходимо использовать оператор ->.

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