所以我在C ++中使用继承的概念来更好地理解它,我使用static_cast将基类对象的地址转换为派生类指针。
class A
{
public:
A() { cout << "A's constructor called " << endl; }
};
class B:public A
{
public:
B() { cout << "B's constructor called " << endl; }
void funcinB() { cout << "Hello from B" << endl; }
};
int main()
{
A a;
B *b = static_cast<B*>(&a);
if (b)
{
b->funcinB();
}
}
程序调用B的方法,这是我不理解的,因为派生类对象从未被构造过。以下是程序的输出
A's constructor called
Hello from B
现在我知道你并没有像这样使用static_cast,但是我正在寻找一个解释为什么程序能够调用B&#39的方法。
谢谢!
答案 0 :(得分:3)
您的程序有不确定的行为。
您的程序可以运行,因为许多(如果不是全部)编译器都会翻译
b->funcinB();
到
funcinB(b);
其中成员函数实现为:
void funcinB(B* const this) { cout << "Hello from B" << endl; }
如果您尝试访问函数中B
的任何成员变量,行为会有所不同。
答案 1 :(得分:1)
方法本身只是一个函数 - 它总是具有相同的地址。
事实上,您可以想象(并且,通过我知道的所有调用约定,实际上就是这种情况),调用object.method(12)
实际上调用了一个名为classname_method(classname *this, int parameter)
的函数。在不同对象上调用方法时的更改只是this
指针,而不是方法!
因此,如果你说服你的编译器你的指针指向派生类实例,那么它会愉快地调用该方法。