Предполагая, что вы не забыли сделать do1 () виртуальным, вы можете проверить & ABase :: do1, & BBase :: do1 и & CBase :: do1 во время выполнения. Я не уверен, что сравнение & ABase :: do1 и & CBase :: do1 вернет одно и то же значение только потому, что CBase не переопределяет функцию, и только потому, что это происходит в одной системе, означает, что всегда будет.
Хотя вы можете проверить их во время выполнения, вы не сможете использовать эту информацию для создания объекта класса CBase, если он не является абстрактным, поскольку он не сможет скомпилироваться, когда он есть.
Вместо этого вы могли бы сделать это способом «C»: иметь таблицу указателей на функции, которые могут иметь значение NULL, проверить, является ли один из них NULL, и создать структуру такого экземпляра или вызвать его, если это не так. .