基于我的研究,我认为这有一个很好的感觉,但希望得到确认。我一直在学习继承和虚拟方法的工作方式。继承和虚拟方法
在底部的代码中,运行main时会得到结果(上面的代码)。如果我将printType方法切换为非虚拟方式,则会打印出“AbstractClass”。
据我所知,使用“虚拟”表示该方法可能被覆盖 - 并总是选择该方法的“最后重新实现”,在这种情况下在ImplementationClass中。我的问题是:
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;
}
不,它并不总是会发生。当在基类的构造函数中调用虚函数并且该函数尚未被覆盖时,原函数将被调用。 –