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

xiaolongren1989 2013-02-05 10:40:30
小弟想在main.cpp里面写个函数,该函数的参数是一个基类(如:A)的某个继承类(如B,C其中之一);请教前辈,怎么能让函数识别传入的参数是那个继承类(究竟是B还是C)? 应当用什么办法实现这个东西那?
谢谢。
...全文
530 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaolongren1989 2013-02-10
  • 打赏
  • 举报
回复
引用 16 楼 zilaishuichina 的回复:
引用 13 楼 xiaolongren1989 的回复:引用 12 楼 korekara88730 的回复: gcc 的compiler 默认开启 rtti ,不用再设置了. 引用 9 楼 xiaolongren1989 的回复:请问前辈问什么说源类型不是多态 因为你的基类没有 virtual 函数所以出错. 是呀基类的确没有virtual,如果没有virtu……
恩多谢前辈指导,等我去进一步学习一下多态性质。
aiyaya730 2013-02-07
  • 打赏
  • 举报
回复
gcc 的compiler 默认开启 rtti ,不用再设置了.
引用 9 楼 xiaolongren1989 的回复:
请问前辈问什么说源类型不是多态
因为你的基类没有 virtual 函数所以出错.
zilaishuichina 2013-02-07
  • 打赏
  • 举报
回复
引用 13 楼 xiaolongren1989 的回复:
引用 12 楼 korekara88730 的回复: gcc 的compiler 默认开启 rtti ,不用再设置了. 引用 9 楼 xiaolongren1989 的回复:请问前辈问什么说源类型不是多态 因为你的基类没有 virtual 函数所以出错. 是呀基类的确没有virtual,如果没有virtual就不可以使用多态性质吧
没有虚函数 那你用基类的指针指向派生类的对象不就没有意义了么 没有虚函数 你怎么用基类的指针去调用派生类的函数实现呢
xiaolongren1989 2013-02-07
  • 打赏
  • 举报
回复
引用 11 楼 Emiyasstar__ 的回复:
最简单的方法,你可以在基类增加一个变量来指示类别
基类里面增加变量指示类别,感觉挺有意思;能具体介绍一下吗?
xiaolongren1989 2013-02-07
  • 打赏
  • 举报
回复
引用 10 楼 zilaishuichina 的回复:
是不是你的Animal类 没有虚函数? 引用 9 楼 xiaolongren1989 的回复:引用 5 楼 zilaishuichina 的回复:dynamic_cast void fun(A *pa) { B *pb = dynamic_cast<B *>(pa);//pb!=NULL 则为B类型 C *pc = dynamic_c……
的确没有,没有就不可以使用多态,只能用最一般的方法每一个继承类分别定义函数了吧
xiaolongren1989 2013-02-07
  • 打赏
  • 举报
回复
引用 12 楼 korekara88730 的回复:
gcc 的compiler 默认开启 rtti ,不用再设置了. 引用 9 楼 xiaolongren1989 的回复:请问前辈问什么说源类型不是多态 因为你的基类没有 virtual 函数所以出错.
是呀基类的确没有virtual,如果没有virtual就不可以使用多态性质吧
yeppo 2013-02-06
  • 打赏
  • 举报
回复
typeid()
Emiyasstar__ 2013-02-06
  • 打赏
  • 举报
回复
最简单的方法,你可以在基类增加一个变量来指示类别
zilaishuichina 2013-02-06
  • 打赏
  • 举报
回复
是不是你的Animal类 没有虚函数?
引用 9 楼 xiaolongren1989 的回复:
引用 5 楼 zilaishuichina 的回复:dynamic_cast void fun(A *pa) { B *pb = dynamic_cast<B *>(pa);//pb!=NULL 则为B类型 C *pc = dynamic_cast<C *>(pa);//pc!=NULL 则为C类型 } 刚才的那个回复弄错了, 尝试了上面……
  • 打赏
  • 举报
回复
引用 5 楼 zilaishuichina 的回复:
dynamic_cast void fun(A *pa) { B *pb = dynamic_cast<B *>(pa);//pb!=NULL 则为B类型 C *pc = dynamic_cast<C *>(pa);//pc!=NULL 则为C类型 }
这个比较靠谱。 +1
zilaishuichina 2013-02-06
  • 打赏
  • 举报
回复
dynamic_cast void fun(A *pa) { B *pb = dynamic_cast<B *>(pa);//pb!=NULL 则为B类型 C *pc = dynamic_cast<C *>(pa);//pc!=NULL 则为C类型 }
xiaolongren1989 2013-02-06
  • 打赏
  • 举报
回复
引用 5 楼 zilaishuichina 的回复:
dynamic_cast void fun(A *pa) { B *pb = dynamic_cast<B *>(pa);//pb!=NULL 则为B类型 C *pc = dynamic_cast<C *>(pa);//pc!=NULL 则为C类型 }
刚才的那个回复弄错了, 尝试了上面方法, int main() { B b; C c; A* a1 = &b; A* a2 = &c; fun (a1); return 0; } void fun(A *pa) { B *pb = dynamic_cast<B *>(pa);//pb!=NULL 则为B类型 C *pc = dynamic_cast<C *>(pa);//pc!=NULL 则为C类型 } 爆出编译错误,cannot dynamic_cast 'viewer' (of type 'class Animal*') to type 'class Person*' (source type is not polymorphic) 小弟实际程序中 B 对应Person, A 对应Animal, pa对应viewer。 小弟用的是codeblock下的gcc。请问前辈问什么说源类型不是多态
xiaolongren1989 2013-02-06
  • 打赏
  • 举报
回复
引用 5 楼 zilaishuichina 的回复:
dynamic_cast void fun(A *pa) { B *pb = dynamic_cast<B *>(pa);//pb!=NULL 则为B类型 C *pc = dynamic_cast<C *>(pa);//pc!=NULL 则为C类型 }
谢谢前辈,我尝试了上面方法 int main () { B b;
yeppo 2013-02-06
  • 打赏
  • 举报
回复
http://www.cnblogs.com/ustc11wj/archive/2012/08/11/2637319.html
ForestDB 2013-02-06
  • 打赏
  • 举报
回复
不太建议去区分类型,直接利用多态的特性。
aiyaya730 2013-02-06
  • 打赏
  • 举报
回复
百度搜索 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. 感觉楼主这样的做法其实并不合理,如果想处理不同的参数,完全可以写不同的函数。 更好的办法等楼下解答 。
judy03 2013-02-05
  • 打赏
  • 举报
回复
你好,我是新手。 写函数头的时候不是要在函数的形参列表里给每一个形参定义其类型的吗?这时候就等于告诉函数传入参数是哪一个类的了。 不知道这样的回答能解决你的疑问不,还是我理解错了问题?

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧