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?
Поскольку вы написали код, он не будет компилироваться из-за нарушений контроля доступа. Поскольку b_ptr
на самом деле имеет тип a *
, а a :: foo
является закрытым, компилятор этого не допустит.
Но сделайте a :: foo
общедоступным, и это правильно вызовет b :: foo
.
Также существует проблема, что вы не определили a :: foo
, поэтому ваша программа не будет связываться. Вам нужно либо определить его, либо сделать чисто виртуальным (например, virtual void foo (void) = 0;
).
Несколько вещей:
foo ()
, а не foo (void)
... последнее не нужно и не идиоматический C ++ (это синтаксис, подобный C) . class
в a * b_ptr = new b;
, поскольку тип a уже объявлен. return 0
). b_ptr
. Лучше написать std :: auto_ptr b_ptr (new b);
. b_ptr
- a *
, а его тип времени выполнения (тип создания / выделения) - b *
. Компилятор (и система типов) знает только о типах времени компиляции, поэтому проверки прав доступа выполняются на основе типа времени компиляции ... следовательно, b_ptr-> foo ()
не допускается. b *
, либо сделайте a :: foo
общедоступным, чтобы использовать его так, как вы хотите.
Сделайте это
class a
{
public:
virtual void foo(void);
};
Вы не можете переопределить частную функцию. Хотя я не уверен, как вам удалось вызвать b_ptr-> foo ()
в любом случае, поскольку a :: foo
является закрытым.