Я думаю, что у меня хорошее чувство, основанное на моих исследованиях, но я хотел бы получить подтверждение. Я узнал о наследовании и о том, как работают виртуальные методы.
В коде внизу я получаю результаты (код выше) при запуске main. Если я переключу метод printType на не виртуальный, я вместо этого получу распечатку «AbstractClass».
Насколько я понимаю, использование «виртуального» означает, что метод может быть перезаписан - и всегда выбирать «последнее переопределение» метода, в данном случае - в ExtensionClass. Мои вопросы:
1) Это ВСЕГДА случается? Или есть случаи, когда вы можете в итоге вызвать метод из AbstractClass (или других классов, если он наследуется несколько раз), даже если это виртуальный метод?
2) кажется, вы не можете создать экземпляр указателя класса, содержащего виртуальные методы. Это правда?
3) Я предполагаю, что в моих двух примерах нет ничего особенного, но я уверен только на 80%.
Большое спасибо за помощь, весь этот виртуальный метод сложно понять из чтения (именно поэтому я и создал фиктивный проект!).
after redefinition
ImplementationClass
printing from virtual method in ImplementationClass
second set of examples
ImplementationClass
printing from virtual method in ImplementationClass
#include <iostream>
using namespace std;
class AbstractClass{
public:
virtual void printStuff() = 0;
AbstractClass() {};
~AbstractClass() {};
virtual void printType() { std::cout << "AbstractClass" << std::endl; }
// void printType() { std::cout << "AbstractClass" << std::endl; }
};
class ImplementationClass : public AbstractClass {
public:
void printStuff() { std::cout << "printing from virtual method in ImplementationClass" << std::endl;}
void printType() { std::cout << "ImplementationClass" << std::endl; }
void printStuffOnlyInDerived() {std::cout << "printing from NONvirtual method in ImplementationClass" << std::endl;}
ImplementationClass() {};
~ImplementationClass() {};
};
int main () {
AbstractClass * absClass;
ImplementationClass * impClass= new ImplementationClass;
absClass = impClass;
printf("\nafter redefinition \n");
absClass->printType();
absClass->printStuff();
AbstractClass * absClassNonPtrImpClass = new ImplementationClass;
printf("\n second set of examples \n");
absClassNonPtrImpClass->printType();
absClassNonPtrImpClass->printStuff();
return 0;
}