Как создать функцию с тем же именем, что и базовый класс в производном классе - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть требование как ниже, например:

class Base 
{

public:
Base() { cout << "Base Class Constructor";}
virtual ~Base() { cout << "Base Class Destructor";}
};

class Der : public Base
{
public:
    Der() { cout << "Der Class Constructor";}
    ~Der() { cout << "Der Class Destructor";}
    void Base() {cout << "Der Class function";}
};

int main(int argc, char* argv[]) 
{
    Base *ptr = new Der();
    ptr->Base(); // throwing error here - "Invalid use of class Base". My intention is to call Der::Base() function. 
    return 1;
}

Пожалуйста, предложите мне способ вызова функции "void Base ()", объявленной в классе Der через указатель Base, указывающий на объект Der.

IDE: Qt Creator ОС: Ubuntu 10.10 Компилятор: GCC (X86)

1 Ответ

1 голос
/ 27 февраля 2012

Наличие функции-члена с тем же именем, что и у базового класса, чрезвычайно плохо работает и подвержено ошибкам (что делает код нечитаемым для людей). Вы уверены, что не можете избежать этого?

Общепринятым условием является использование имен классов, начинающихся с заглавных букв, и функций-членов в нижнем регистре. Если вы будете следовать этому соглашению, вы не пострадаете, как вы!

Если вы действительно настаиваете, вы можете попробовать

   (static_cast<Der*>(ptr))->Base();

Более безопасный способ - написать что-то вроде

  { Der* derptr = dynamic_cast<Der*>(ptr);
    if (derptr) 
       derptr->Base(); 
  }

Но на самом деле, вам следует избегать кодирования такого бессмысленного . Ваш код становится нечитаемым, и это повредит даже вам через несколько недель ...

Не забудьте скомпилировать свой код с помощью g++ -Wall -g (улучшая его, пока вы не получите предупреждений о компиляции) и использовать отладчик gdb для его отладки. Не забудьте завершить свои выходные операторы << endl.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...