C++语法中的一个奇怪的执行有关问题 - 关于this指针,求大侠来
C++语法中的一个奇怪的执行问题 - 关于this指针,求大侠来
class A{
public:
A() { Instance(); }
void Show() { Instance(); }
public:
virtual void Instance();
};
void A::Instance()
{
printf("A:Instance\n");
}
class B : public A{
public:
virtual void Instance();
};
void B::Instance()
{
printf("B:Instance\n");
}
int main()
{
B b;
b.Show();
return 0;
}
为什么B b; 结果是A:Instance
而b.Show(); 是 B:Instance
太奇怪了
------解决方案--------------------
构造函数里虚函数没有多态行为。C++标准是特意这么设计的,因为这样可以避免一些更严重的问题。
------解决方案--------------------
构造函数里调用虚函数只会调用本类的版本,没有多态行为。从逻辑上推理可以得出,C++编译器只能是这样处理,也必须是这样。参考C++的虚函数表指针的实现原理。
------解决方案--------------------
有本书叫c++对象模型,上面专门提到这个问题
class A{
public:
A() { Instance(); }
void Show() { Instance(); }
public:
virtual void Instance();
};
void A::Instance()
{
printf("A:Instance\n");
}
class B : public A{
public:
virtual void Instance();
};
void B::Instance()
{
printf("B:Instance\n");
}
int main()
{
B b;
b.Show();
return 0;
}
为什么B b; 结果是A:Instance
而b.Show(); 是 B:Instance
太奇怪了
------解决方案--------------------
构造函数里虚函数没有多态行为。C++标准是特意这么设计的,因为这样可以避免一些更严重的问题。
------解决方案--------------------
构造函数里调用虚函数只会调用本类的版本,没有多态行为。从逻辑上推理可以得出,C++编译器只能是这样处理,也必须是这样。参考C++的虚函数表指针的实现原理。
------解决方案--------------------
有本书叫c++对象模型,上面专门提到这个问题