以下是这种情况的一个例子:
CAnimal *poTest = new CDog();
当我写“poTest->”时我只能看到基类中的函数(例如:CAnimal)而不是派生类中的函数。我怎样才能访问这些?
答案 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();