有什么方法可以让ptr-> fun2()成为可能吗?
class A
{
void fun1()
{
A* ptr;
ptr->fun2();
}
}
class B : class A
{
void fun2()
{
}
}
答案 0 :(得分:5)
这是不可能的。 C ++是一种静态类型语言。 ptr
的类型是指向A
的指针。 fun2
不是A
的成员。根据定义,不可能通过指向fun2
的{{1}}来调用A
。
这通常通过铸造来解决。由于您因未指明原因而取消资格,因此无法按照您的意愿行事。
答案 1 :(得分:2)
没有。 A
没有成员函数fun2
,因此您不能通过ptr->fun2()
类型的指针调用A*
。
如果指针恰好指向具有此类成员函数的派生对象,那么您可以static_cast
指向具有成员函数的类型的指针。如果您不知道,那么您可以尝试dynamic_cast
(但只有在类型是多态的情况下),但这通常是一个糟糕的设计(但有时可以)而不是您想要做的。
我只是想知道我的问题是否有任何解决方案
如果您想使用指向fun2
的指针调用A
,则解决方案是将成员函数fun2
添加到类A
。如果您希望将ptr->fun2
的调用分发到B::fun2
,那么您需要将该功能设置为虚拟 - 但由于某种原因,您明确不希望使用专为此设计的工具这个问题。
我不想将fun2()虚拟化,因为只有很多派生类中的一个会实现它。
这并不妨碍你在A
中使用虚函数,但是对于接口来说,只有一个派生类使用的虚函数可能是坏事。
我建议不要使用A*
指针,而应首先使用B*
。那么你不需要强制转换,也不需要调用虚函数。
是否发生了类型检查,ptr是否指向B类对象,然后在fun1()中创建“ptr-> fun2()”
然后施放可能不是一个糟糕的选择。但我有另一个建议:将fun1
分成两个版本。调用B
类型的一个调用fun2
,其中一个类型调用。