通过指针访问派生类的函数(C ++)

时间:2011-03-28 20:58:14

标签: c++

以下是这种情况的一个例子:

CAnimal *poTest = new CDog();

当我写“poTest->”时我只能看到基类中的函数(例如:CAnimal)而不是派生类中的函数。我怎样才能访问这些?

6 个答案:

答案 0 :(得分:4)

您已将 poTest 声明为 CAnimal

因此,您只能看到 CAnimal 可以看到的内容。

如果您想使用 CDog 使用的方法,请将其声明。

答案 1 :(得分:2)

CDog * test = new CDog();
test->someFunction();


CAnimal *poTest = new CDog();
static_cast<CDog *>(poTest)->someFunction();

我假设CDog(带有C前缀btw的内容)继承CAnimal。编译器无法知道您的poTest变量恰好是CDog - 它只能看到它是CAnimal。因此,您无法使用类型为CDog的变量调用CAnimal *的成员函数 - 您需要将指针转换为CDog *,这会告诉编译器“将其视为一个CDog“。

答案 2 :(得分:1)

一般情况下,在这种情况下,您应该只使用基类的接口,并且该功能不可访问。如果您尝试使用派生界面,请考虑存储指向CDog而非CAnimal的指针。不要试图使用子方​​法,而是使父接口合适。

如果你真的知道你的指针指向一只狗你可以垂头丧气,虽然在某些情况下这可能是一种设计气味:

CDog* cdog = dynamic_cast<CDog *>(poTest);  // Safer
if(cdog)
{
    cdog->someFunction();
}

static_cast<CDog *>(poTest)->someFunction();   // Faster

答案 3 :(得分:0)

将其定义为狗:

 CDog *poTest = new CDog();

或使用演员:

static_cast<CDog*>(poTest)->bark();

或者,根据其他一些答案,使用one of the other casting functions/operators。然而,一般来说,大量使用演员被认为是不好的做法;这是许多主流语言提供泛型的原因之一(参见例如here)。

答案 4 :(得分:0)

由于你声明poTest是一个CAnimal,你可以只调用在CAnimal中定义的函数。通常这是因为基类应该公开所需的方法作为虚函数,处理CAnimal实例并且必须投射CDog通常表示在设计中有一些需要改进的地方。

答案 5 :(得分:0)

dynamic_cast<CDog*>(poTest)->CDogSpecificFunction();