【发布时间】:2017-08-16 21:42:43
【问题描述】:
我花了很多时间试图弄清楚为什么我的代码在运行后显示“Derived3”,但我根本无法理解。从我在许多帖子中读到的内容来看,dynamic_cast 应该以某种方式说明指针(在本例中为 b)是否(在本例中)Derived2。但是,它通过了条件,当它应该从 Derived2 类中打印出 display() 函数时,它奇怪地显示了 Derived3 类中的函数。我只是想知道为什么程序显示“Derived 3”而不是不显示任何内容,因为 b 指针显然没有指向 Derived2 对象。
#include <iostream>
using namespace std;
class Base
{
int b;
public:
virtual void display()
{
cout<<"Base"<<endl;
}
};
class Derived: virtual public Base{
public:
void display()
{
cout<<"Derived"<<endl;
}
};
class Derived2: virtual public Base{
public:
void display()
{
cout<<"Derived 2"<<endl;
}
};
class Derived3:public Derived,public Derived2{
public:
void display()
{
cout<<"Derived 3"<<endl;
}
};
int main()
{
Base *b = new Derived3();
Derived2 *aux = dynamic_cast<Derived2*>(b);
if(aux)
{
aux->display();
}
return 0;
}
不过,稍微修改一下代码后,它就可以正常工作了。
#include <iostream>
using namespace std;
class Base
{
int b;
public:
virtual void display()
{
cout<<"Base"<<endl;
}
};
class Derived: public Base{
public:
void display()
{
cout<<"Derived"<<endl;
}
};
class Derived2: public Base{
public:
void display()
{
cout<<"Derived 2"<<endl;
}
};
class Derived3:public Base{
public:
void display()
{
cout<<"Derived 3"<<endl;
}
};
int main()
{
Base *b = new Derived3();
Derived2 *aux = dynamic_cast<Derived2*>(b);
if(aux)
{
aux->display();
}
return 0;
}
【问题讨论】:
-
附带说明,如果您不想要“Is-a”关系,请使用组合而不是继承。
标签: c++ dynamic-cast