статический полиморфизм — это правильный сценарий полимофизма в C ++?

Я нахожусь в странном замешательстве после этих многих лет. Я знаю о проблемах полиморфизма времени выполнения, виртуальных функциях и многих других вещах, но не был уверен в приведенном ниже примере кода:

    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 ++ Сценарий выше моих вопросов:

  1. Можно ли назвать этот сценарий полиморфизмом?
  2. Если да, то можно ли назвать это статическим полиморфизмом во время компиляции?
  3. Если нет, то должен ли я считать, что это неверная реализация и должна использоваться виртуальная?

Заранее спасибо!

1

Решение

  1. Можно ли назвать этот сценарий полиморфизмом?

Нет.

  1. Если да, то можно ли назвать это статическим полиморфизмом во время компиляции?

Смотри ниже.

  1. Если нет, то должен ли я считать, что это неверная реализация и должна использоваться виртуальная?

Да, используя 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;
}
};
1

Другие решения


По вопросам рекламы [email protected]