当前位置: 代码迷 >> C++ >> 小弟请问前辈个关于继承的有关问题
  详细解决方案

小弟请问前辈个关于继承的有关问题

热度:9157   发布时间:2013-02-26 00:00:00.0
小弟请教前辈个关于继承的问题
小弟想在main.cpp里面写个函数,该函数的参数是一个基类(如:A)的某个继承类(如B,C其中之一);请教前辈,怎么能让函数识别传入的参数是那个继承类(究竟是B还是C)? 应当用什么办法实现这个东西那?
谢谢。

------解决方案--------------------------------------------------------
百度搜索  rtti. 
rtti 需要在编译之前启用rtti的编译选项才可以使用。
并且 rtti 需要基类具备多态性。
启用 rtti后,支持C++ type_id() 和 dynamic_cast.
如下例:


#include<iostream>
using namespace std;

class A
{
virtual void test() = 0;
};
class B : public A
{
void test()
{
cout << "this is b test()." << endl;
}
};
class C : public A
{
void test()
{
cout << "this is c test()." << endl;
}
};

void func(A* pParam)
{

B* p = NULL;
p = dynamic_cast<B*>(pParam);

if( p == NULL)
{
cout << "not b"<< endl;
}
else
{
cout << "is b"<<endl;
}
}

int main(int argc,char** argv)
{

A* b = new B();
A* c = new C();
func(b);
func(c);

delete b;
b = NULL;
delete c;
c = NULL;
return 0;
}

另外需要注意 rtti 貌似会出现一些移植不兼容的问题。比如苹果的 xcode 似乎就不支持 rtti.

感觉楼主这样的做法其实并不合理,如果想处理不同的参数,完全可以写不同的函数。
更好的办法等楼下解答 。

------解决方案--------------------------------------------------------
http://www.cnblogs.com/ustc11wj/archive/2012/08/11/2637319
------解决方案--------------------------------------------------------
不太建议去区分类型,直接利用多态的特性。

------解决方案--------------------------------------------------------
最简单的方法,你可以在基类增加一个变量来指示类别
------解决方案--------------------------------------------------------
引用:
引用:
gcc 的compiler 默认开启 rtti ,不用再设置了.

引用:请问前辈问什么说源类型不是多态
因为你的基类没有 virtual 函数所以出错.
是呀基类的确没有virtual,如果没有virtual就不可以使用多态性质吧


没有虚函数 那你用基类的指针指向派生类的对象不就没有意义了么
没有虚函数 你怎么用基类的指针去调用派生类的函数实现呢
  相关解决方案