The only difference between a class and a struct is a class has private access and private inheritance by default and a struct has public access and public inheritance by default. The only place I'm aware of that you can't replace class with struct is in a template definition. For example, template, where you can also use template, but template is incorrect.
struct is a class keyword and anything you can do with a class you can do with struct. Virtual functions, pure virtual functions, inheritance, data member initialization all of it, there aren't any restrictions. You could literally go through a program and replace every instance of class, except as noted previously, with the equivalent struct definition.