c++ 父类指针如何操作子类的新函数

只有父类指向子类的指针
现在我需要操作子类新增的函数

有什么方法能把这个父类指针强制转化为子类指针么?知道子类的类型名
我知道可以在父类加虚函数。但我不想这样。我想强转,但vs似乎会报错……

  父类指针无法直接调用子类的新函数,需要转换为子类的指针后方可调用。


  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参考:

  http://baike.baidu.com/link?url=MFk9AusANTH86IWBNVk-2zzztggrvbnlpW8T1MsT8aCUhtIv7SWBxgCa6qryivPJLkgdcJz2ULBl2QCzK8CK6a

温馨提示:内容为网友见解,仅供参考
第1个回答  2009-05-31
要飞得你这么做,我觉得最好的办法就是用虚函数。要知道引进虚函数的目的就是归一化,就是说让父类类型的指针去调用各类不同子类的虚函数,通过动态绑定实现多态。
另外,我觉得你的逻辑。。。你知道子类的指针,又知道子类的类型名,为什么不直接用呢?还要用父类的东西干什么呢?
你知道:
derive D;//子类的类型是derive
base *B=&D;//父类类型的指针B指向子类对象D
//然后你想调用子类新增函数func(),那就:
derive *B=&D;//不就OK了吗?搞这么多花样做什么呢?
第2个回答  推荐于2017-11-27
借助楼上大哥的程序:)
#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本回答被提问者采纳
第3个回答  2009-05-29
不能强制转化,如果你想实现你所说的功能,你可以用虚函数,就是将想要操作的函数作为父类的虚函数,然后子类里面重新实现它就可以实现了。
第4个回答  2009-05-29
可以使用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();
}
相似回答