この動きがいまいち理解できません。
class TestBase {
public:
print() { std::cout << "TestBase" << std::endl; }
};
class TestSub : public TestBase {
public:
print() { std::cout << "TestSub" << std::endl;}
};

これで、TestBase* testBase = new TestSub; testBase->print() をすると、TestBaseが呼ばれます。
で、TestBaseのprintにvirtualをつけると、TestSubが呼ばれます。

この動きが良くわかりません。
わかりやすく教えてください。