Я нахожусь в странном замешательстве после этих многих лет. Я знаю о проблемах полиморфизма времени выполнения, виртуальных функциях и многих других вещах, но не был уверен в приведенном ниже примере кода:
class A{
public:
void f(){
cout<<"I m called from A"<<endl;
}
};
class B : public A{
public:
void f(){
cout<<"I m called from B"<<endl;
}
};
int main(void){
B* b1 = new B();
A* a1 = b1; //Object reference of class B is assigned to a pointer of class A
b1->f(); //Output is "I m called from B"a1->f(); //Output is "I m called from A"
return 0;
}
Принимая во внимание C ++ Сценарий выше моих вопросов:
Заранее спасибо!
- Можно ли назвать этот сценарий полиморфизмом?
Нет.
- Если да, то можно ли назвать это статическим полиморфизмом во время компиляции?
Смотри ниже.
- Если нет, то должен ли я считать, что это неверная реализация и должна использоваться виртуальная?
Да, используя virtual void f();
должен исправить ваш образец. Вы можете обойти, используя virtual
со статическим полиморфизмом с чем-то вроде этого:
template<typename Derived>
class A{
public:
void f(){
static_cast<Derived*>(this)->fImpl();
}
void fImpl() {
cout<<"I m called from A"<<endl;
}
};
class B : public A<B> {
public:
void fImpl(){
cout<<"I m called from B"<<endl;
}
};