使用 static_cast、dynamic_cast 或显式转换的指向基指针转换的派生指针不会调用基函数
Derived pointer to Base pointer conversion using static_cast, dynamic_cast,or explicit conversion won't call the base function
我有以下代码。
#include <iostream>
using namespace std;
class Base
{
public:
virtual int f(){cout<<"Base"<<endl;}
};
class Derived:public Base
{
public:
int f(){cout<<"Derived"<<endl;}
};
int main()
{
Base b;
Derived d;
b.f(); ///base
((Base)d).f(); ///base
cout<<"----------------"<<endl;
Base *b1 = new Base;
Base *b2 = new Derived;
Derived *d1 = new Derived;
b1->f(); ///base
((Base*)d1)->f(); ///derived
((Base*)b2)->f(); ///derived
static_cast<Base*>(d1);
d1->f();///derived
static_cast<Base*>(b2);
b2->f();///derived
cout<<"----------------"<<endl;
Base *b5 = dynamic_cast<Base*>(b2);
Base *b6 = dynamic_cast<Base*>(d1);
if(b5)
b5->f(); ///derived
if(b6)
b6->f(); ///derived
return 0;
}
我想问为什么派生的 *d1 OR b2 指针在使用显式转换 (Base)、静态转换 (static_cast(d1) ) 或动态转换 (dynamic_cast(d1)) 将不会在转换后调用基础 class 的 f() 函数。似乎每次都从派生的 class 调用 f() 函数。
此外,奇怪的是,当我以这种方式声明对象时。转换有效并调用基本函数。
Base b;
Derived d;
b.f(); ///base
((Base)d).f(); ///base
现在,我明白从 Base class 访问 f() 的正确方法是 d->Base::f()
,但我为什么要使用 dynamic_cast 或 static_cast因为它们不会将派生指针转换为基数并调用正确的函数。如果可能的话,我需要一个详细的解释。谢谢!
幸运的是,对于你和我的键盘来说,解释是微不足道的:
((Base)d)
切片 对象 d
到值复制的 Base
实例。
((Base*)d1)->f()
仍然会调用派生方法,因为 Base
因此 Derived
是多态类型,尽管 ((Base*)d1)
是一个 Base*
指针,它指向一个 Derived
对象。 static_cast
和 dynamic_cast
.
同上
我有以下代码。
#include <iostream>
using namespace std;
class Base
{
public:
virtual int f(){cout<<"Base"<<endl;}
};
class Derived:public Base
{
public:
int f(){cout<<"Derived"<<endl;}
};
int main()
{
Base b;
Derived d;
b.f(); ///base
((Base)d).f(); ///base
cout<<"----------------"<<endl;
Base *b1 = new Base;
Base *b2 = new Derived;
Derived *d1 = new Derived;
b1->f(); ///base
((Base*)d1)->f(); ///derived
((Base*)b2)->f(); ///derived
static_cast<Base*>(d1);
d1->f();///derived
static_cast<Base*>(b2);
b2->f();///derived
cout<<"----------------"<<endl;
Base *b5 = dynamic_cast<Base*>(b2);
Base *b6 = dynamic_cast<Base*>(d1);
if(b5)
b5->f(); ///derived
if(b6)
b6->f(); ///derived
return 0;
}
我想问为什么派生的 *d1 OR b2 指针在使用显式转换 (Base)、静态转换 (static_cast(d1) ) 或动态转换 (dynamic_cast(d1)) 将不会在转换后调用基础 class 的 f() 函数。似乎每次都从派生的 class 调用 f() 函数。
此外,奇怪的是,当我以这种方式声明对象时。转换有效并调用基本函数。
Base b;
Derived d;
b.f(); ///base
((Base)d).f(); ///base
现在,我明白从 Base class 访问 f() 的正确方法是 d->Base::f()
,但我为什么要使用 dynamic_cast 或 static_cast因为它们不会将派生指针转换为基数并调用正确的函数。如果可能的话,我需要一个详细的解释。谢谢!
幸运的是,对于你和我的键盘来说,解释是微不足道的:
((Base)d)
切片 对象 d
到值复制的 Base
实例。
((Base*)d1)->f()
仍然会调用派生方法,因为 Base
因此 Derived
是多态类型,尽管 ((Base*)d1)
是一个 Base*
指针,它指向一个 Derived
对象。 static_cast
和 dynamic_cast
.