Moa*_*nti 2 c++ polymorphism inheritance
我搜索过问题,查看论坛,书籍等等.我可以识别方法的多态行为,并且在编译或运行时决定调用的方法时有很多简单的例子.但我对此代码感到困惑,其中C类继承自B的继承自A的代码:
class A {
protected:
int x;
public:
virtual void change() = 0;
virtual void change(int a) { x = a; }
};
class B : public A {
public:
void change() { x = 1; }
};
class C : public B {
public:
void change() { x = 2; }
void change(int a) { x = a*2; }
};
int main () {
B *objb = new B();
C *objc = new C();
A *obja;
objb->change();
obja = objc;
objc->change();
obja->change(5);
// ...
}
Run Code Online (Sandbox Code Playgroud)
许多示例告诉(并且很明显)发生了多态行为,并且在运行时决定在执行以下行时调用哪个方法:
obja->change(5);
Run Code Online (Sandbox Code Playgroud)
但我的问题是:
当我调用以下内容时会发生什么(从纯虚拟中覆盖)?
objb->change();
Run Code Online (Sandbox Code Playgroud)当我调用以下内容时会发生什么(从虚拟但非纯粹的覆盖)?
objc->change(5);
Run Code Online (Sandbox Code Playgroud)由于指针变量的类声明与对象相同,是否应该在编译或运行时决定调用方法?
如果编译器可以在编译时推断出实际类型,则可以避免虚函数调度.但它只能在证明行为等同于运行时调度时才能这样做.这是否发生取决于您的特定编译器的智能程度.
真正的问题是,你为什么关心?您显然理解调用虚函数的规则,并且行为的语义始终是运行时调度的语义,因此它对您编写代码的方式没有任何影响.