c++ 父类指针如何操作子类的新函数
只有父类指向子类的指针现在我需要操作子类新增的函数有什么方法能把这个父类指针强制转化为子类指针么?知道子类的类型名我知道可以在父类加虚函数。但我不想这样。我想强转,但vs...
只有父类指向子类的指针
现在我需要操作子类新增的函数
有什么方法能把这个父类指针强制转化为子类指针么?知道子类的类型名
我知道可以在父类加虚函数。但我不想这样。我想强转,但vs似乎会报错…… 展开
现在我需要操作子类新增的函数
有什么方法能把这个父类指针强制转化为子类指针么?知道子类的类型名
我知道可以在父类加虚函数。但我不想这样。我想强转,但vs似乎会报错…… 展开
推荐于2018-03-14 · 知道合伙人软件行家
gongxinheng
知道合伙人软件行家
向TA提问 私信TA
知道合伙人软件行家
采纳数:55
获赞数:380
6年游戏开发经验。曾在多个MMO PC游戏以及手游项目担任主程。 目前在美国华盛顿州立大学留学并参与研究项目
向TA提问 私信TA
关注
展开全部
父类指针无法直接调用子类的新函数,需要转换为子类的指针后方可调用。
C++编译器在编译的时候是做静态类型分析。也就是说,你的父类指针是否真的指向一个子类类型,编译器并不会做这个假设。所以你用父类指针去调用子类的函数是无法被识别的。这里提供一种不安全和一种安全的转换方式可以实现该功能:
假设我们有父类和子类的定义如下:
class Base
{
public:
void virtual Func()
{
cout << "Base\n";
}
};
class Derived : public Base
{
public:
void Func()
{
cout << "Derived\n";
}
void NewFunc()
{
cout << "New func\n";
}
};
1. 强制转换(不安全)
Base* b = new Derived();
b->Func();
// 不安全的转换
Derived* d = (Derived*)b;
d->NewFunc();
这里之所以说不安全是因为转换的时候无法得知是否转换成功。编译器强制把d当成Derived类型去使用。比如说b本来是真的指向Base而不是Derived类型那么强制转换后调用Derived的NewFunc可能会导致程序崩溃。
2.动态转换,dynamic_cast(安全)
Base* b = new Derived();
b->Func();
// 安全转换
Derived* d = dynamic_cast<Derived*>(b);
if (d != NULL)
{
d->NewFunc();
}
dynamic_cast是在运行时去做转换而非编译时,所以它可以给出是否转换成功的信息。如果转换不成功则返回NULL。所以可以判断转换结果是否为NULL来决定是否能使用该指针不会导致程序崩溃
dynamic_cast参考:
展开全部
要飞得你这么做,我觉得最好的办法就是用虚函数。要知道引进虚函数的目的就是归一化,就是说让父类类型的指针去调用各类不同子类的虚函数,通过动态绑定实现多态。
另外,我觉得你的逻辑。。。你知道子类的指针,又知道子类的类型名,为什么不直接用呢?还要用父类的东西干什么呢?
你知道:
derive D;//子类的类型是derive
base *B=&D;//父类类型的指针B指向子类对象D
//然后你想调用子类新增函数func(),那就:
derive *B=&D;//不就OK了吗?搞这么多花样做什么呢?
另外,我觉得你的逻辑。。。你知道子类的指针,又知道子类的类型名,为什么不直接用呢?还要用父类的东西干什么呢?
你知道:
derive D;//子类的类型是derive
base *B=&D;//父类类型的指针B指向子类对象D
//然后你想调用子类新增函数func(),那就:
derive *B=&D;//不就OK了吗?搞这么多花样做什么呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
借助楼上大哥的程序:)
#include <iostream>
using namespace std;
class A
{
public:
void print()
{ cout << "this line is from A" << endl; }
};
class B : public A
{
public:
void print()
{ cout << "this line is from B" << endl; }
};
void main()
{
A *p = new A;
((B*)p)->print();
delete p;
}
输出this line is from B
#include <iostream>
using namespace std;
class A
{
public:
void print()
{ cout << "this line is from A" << endl; }
};
class B : public A
{
public:
void print()
{ cout << "this line is from B" << endl; }
};
void main()
{
A *p = new A;
((B*)p)->print();
delete p;
}
输出this line is from B
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不能强制转化,如果你想实现你所说的功能,你可以用虚函数,就是将想要操作的函数作为父类的虚函数,然后子类里面重新实现它就可以实现了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以使用static_cast或者reinterpret_cast。
#include <iostream>
using namespace std;
class A
{
};
class B : public A
{
public:
void print()
{ cout << "this line is from B" << endl; }
};
void main()
{
A *a = new B;
B *b = static_cast<B *>(a);
//B *b = reinterpret_cast<B *>(a);
b->print();
}
#include <iostream>
using namespace std;
class A
{
};
class B : public A
{
public:
void print()
{ cout << "this line is from B" << endl; }
};
void main()
{
A *a = new B;
B *b = static_cast<B *>(a);
//B *b = reinterpret_cast<B *>(a);
b->print();
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询