Виртуальная функция

class a
{
 virtual void foo(void) ;
};

class b : public  a
{
public:
 virtual void foo(void)
  {
  cout<< "class b";
  }
};

int main ( ) 
{
class a *b_ptr = new b ;
b_ptr->foo();
}

ведите меня, почему b_ptr-> нечто () не назовет нечто () функцией класса b?

7
задан Peter Alexander 18 March 2010 в 01:15
поделиться

4 ответа

Потому что a: foo () не является общедоступным.

3
ответ дан 6 December 2019 в 09:59
поделиться

Поскольку вы написали код, он не будет компилироваться из-за нарушений контроля доступа. Поскольку b_ptr на самом деле имеет тип a * , а a :: foo является закрытым, компилятор этого не допустит.

Но сделайте a :: foo общедоступным, и это правильно вызовет b :: foo .

Также существует проблема, что вы не определили a :: foo , поэтому ваша программа не будет связываться. Вам нужно либо определить его, либо сделать чисто виртуальным (например, virtual void foo (void) = 0; ).

17
ответ дан 6 December 2019 в 09:59
поделиться

Несколько вещей:

  1. Напишите foo () , а не foo (void) ... последнее не нужно и не идиоматический C ++ (это синтаксис, подобный C) .
  2. Не записывайте class в a * b_ptr = new b; , поскольку тип a уже объявлен.
  3. Вы должны вернуться из функции, которая не возвращает void (добавить return 0 ).
  4. Ваш код никогда не освобождает b_ptr . Лучше написать std :: auto_ptr b_ptr (new b); .
  5. Тип времени компиляции (объявленный тип) b_ptr - a * , а его тип времени выполнения (тип создания / выделения) - b * . Компилятор (и система типов) знает только о типах времени компиляции, поэтому проверки прав доступа выполняются на основе типа времени компиляции ... следовательно, b_ptr-> foo () не допускается.
  6. Либо используйте объявленный тип b * , либо сделайте a :: foo общедоступным, чтобы использовать его так, как вы хотите.
0
ответ дан 6 December 2019 в 09:59
поделиться

Сделайте это

class a
{
public:
    virtual void foo(void);
};

Вы не можете переопределить частную функцию. Хотя я не уверен, как вам удалось вызвать b_ptr-> foo () в любом случае, поскольку a :: foo является закрытым.

-1
ответ дан 6 December 2019 в 09:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: