class A
{
public:
virtual void msg() { std::cout << "msg in A" << std::endl; }
};class B : public A
{
public:
B::B() { msg(); } // ÔÚ¹¹ÔìÖе÷ÓÃmsg()·½·¨
void callmsg() { msg(); }
};class C : public B
{
virtual void msg() { std::cout << "msg in C" << std::endl; }
};
int main() {
C *c = new C;
c->callmsg(); delete c; c = NULL;
system("pause"); return 0;
}//////////////////////////////////////////////////////////////////////////////////
输出结果:
msg in A
msg in C我不知道怎么比较合理正规的解释这个问题?
谢谢各位帮助
{
public:
virtual void msg() { std::cout << "msg in A" << std::endl; }
};class B : public A
{
public:
B::B() { msg(); } // ÔÚ¹¹ÔìÖе÷ÓÃmsg()·½·¨
void callmsg() { msg(); }
};class C : public B
{
virtual void msg() { std::cout << "msg in C" << std::endl; }
};
int main() {
C *c = new C;
c->callmsg(); delete c; c = NULL;
system("pause"); return 0;
}//////////////////////////////////////////////////////////////////////////////////
输出结果:
msg in A
msg in C我不知道怎么比较合理正规的解释这个问题?
谢谢各位帮助
我翻了下inside c++ object model也没找到答案
对于构造函数,自然是要先构造基类对象,然后再逐步构造子类对象。因此,在C *c = new C;时,首先会构造A对象部分,然后构造B对象部分,在构造A对象部分时,虚函数msg已经形成。构造B对象部分时,会调用msg函数,由于此时C对象还没有开始构造,因此,虚拟机制是无法找到C对象的msg函数的,因此,它必然就执行A对象中的msg函数了。因此输出为msg in A
但是,当C *c = new C执行完毕后,C对象部分也已经构造完成,这时候调用c->callmsg();由于C对象构造完成,因此虚拟机制自然就能够定位到C对象的msg函数了,因此输出为msg in C
不知道这样解释是不是可以。
#include <iostream>
using namespace std;
struct A
{
virtual void func()
{cout<<"a";}
};struct B:A
{
void func()
{
cout<<"b";
}
};struct C:B
{
C()
{
func();
}
};int main()
{
C wokao;
}
=======================================================回复人: 84830388(新手上路) ( ) 信誉:106 2005-07-15 12:46:00 得分: 0
可以这样理解:
对于构造函数,自然是要先构造基类对象,然后再逐步构造子类对象。因此,在C *c = new C;时,首先会构造A对象部分,然后构造B对象部分,在构造A对象部分时,虚函数msg已经形成。构造B对象部分时,会调用msg函数,由于此时C对象还没有开始构造,因此,虚拟机制是无法找到C对象的msg函数的,因此,它必然就执行A对象中的msg函数了。因此输出为msg in A
但是,当C *c = new C执行完毕后,C对象部分也已经构造完成,这时候调用c->callmsg();由于C对象构造完成,因此虚拟机制自然就能够定位到C对象的msg函数了,因此输出为msg in C
不知道这样解释是不是可以。
=====================================================
msg形成在代码写完的时候就完成了,构造函数只不过是写vtbl而已,把msg的位置写进去而以……
因此,在C *c = new C;时,首先会构造A对象部分,然后构造B对象部分,最后C部分。
在构造A对象部分时,虚表里msg的地址是A::msg。
在构造B对象部分时,虚表里msg的地址是A::msg。(构造函数调用msg函数是A::msg)
在构造C对象部分时,虚表里msg的地址是C::msg。
但是,当C *c = new C执行完毕后,C对象部分也已经构造完成,
这时候调用c->callmsg();是C::msg不知道这样解释是不是可以。
---------------
这个我想可以在C::C里调用msg,别的想不出来:(
这句太牛了吧,什么意思?