C++居然能用父类指针(里面存的也是父类)调用子类(子类独有的)函数?
本文介绍了C++居然能用父类指针(里面存的也是父类)调用子类(子类独有的)函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
昨天问另外一个问题的时候, 今天早上有人回复给出了这样一段代码, 我试着运行了一下, 结果却大大出乎我的意料 :
class Father
{
public:
virtual void func1() { std::cout << "Father" << std::endl; }
virtual ~Father(){}
};
class Son :public Father
{
public:
virtual void func1(){ std::cout << "Son1" << std::endl; }
void func2(){ std::cout << "Son2" << std::endl; }
virtual ~Son(){}
};
class Factory
{
private:
Father* myFather;
public:
void setFun(Father* m_Father) { myFather = m_Father; }
Father* getFun() { return myFather;};
};
int main()
{
Father *m_Father = new Father();
Factory* m_Factory = new Factory();
m_Factory->setFun(m_Father );
m_Factory->getFun()->func1();
dynamic_cast<Son*>(m_Factory->getFun())->func2();
///
return 0;
}
运行结果是 :
Father
Son2
这让我感觉特别的奇怪 :
首先对于main
中的变量m_Father
, 他的静态类型和动态类型都是Father指针
, 之后使用dynamic_cast<Son*>
进行强制转换, 按照我的设想, 只有当m_Father
的动态类型, 也就是实际指向一个Son
的时候, 转换才能够成功, 然而这里不但成功转换, 同时还调用了Son
独有的函数fun2
, 这不是太奇怪了吗?
解决方案
你试试在子类里加个数据成员然后在调用func时打印它。
这篇关于C++居然能用父类指针(里面存的也是父类)调用子类(子类独有的)函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文