如何使用基类指针调用派生类非虚拟成员函数,而无需类型转换和使用多态性
How can I call derived class non virtual member function using base class pointer without typecasting and using polymorphism?
有什么可能的方法可以让ptr->fun2((成为可能吗?
class A
{
void fun1()
{
A* ptr;
ptr->fun2();
}
}
class B : class A
{
void fun2()
{
}
}
这是不可能的。C++是一种静态类型语言。ptr
的类型是指向A
的指针。 fun2
不是A
的成员。根据定义,不可能通过指向类型 A
的指针/引用来调用fun2
。
这通常通过铸造来解决。由于您因未指定的原因取消了资格,因此无法做您想做的事。
No. A
没有成员函数fun2
,因此您不能通过 A*
类型的指针调用ptr->fun2()
。
如果指针恰好指向具有此类成员函数的派生对象,则可以static_cast
指向具有成员函数的类型的指针。如果你不知道,那么你可以尝试dynamic_cast
(但前提是类型是多态的(,但这通常是一个糟糕的设计(但有时还可以(,而不是你想做的。
我只想知道我的问题是否有任何解决方案
如果要用指向A
的指针调用fun2
,那么解决方案是将成员函数fun2
添加到类A
中。如果您希望将调用ptr->fun2
调度到 B::fun2
,那么您需要使函数成为虚拟函数 - 但由于某种原因,您明确不想使用为此问题设计的工具。
我也不想使fun2((虚拟,因为许多派生的base类中只有一个会实现它。
这并不妨碍你在A
中拥有一个虚函数,但对于接口来说,拥有一个仅由一个派生类使用的虚函数可能是不好的。
我的建议是不要使用指针A*
而是首先使用B*
。然后你不需要转换,也不需要调用虚函数。
t 发生类型检查是否 ptr 指向类型 B 的对象,然后在 fun1(( 中进行"ptr->fun2((">
那么选角可能不是一个糟糕的选择。但我还有另一个建议:将fun1
分成两个版本。一个用于调用 fun2
的类型B
,另一个用于其他类型的类型。
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 如何调用指针类型的方法(禁用多态性)?
- 使用多态性时在子对象之间进行转换?
- 如何为多态性中的指定类型分配内存
- C 多态性:允许模棱两可的成员类型
- 如何避免使用模板类型的派生类进行多态性动态强制转换
- 自动复制=按值并支持多态性的适当类型的非静态字段
- 具有不同模板类型的子类的多态性
- 多态性并获取C++中的对象类型
- C 模板和多态性无缝合用户定义的转换
- 多态性(继承)和价值类型
- c++多态性:基类的上转换/下转换和容器,缺少数据
- C++技术:类型擦除与纯多态性
- 具有 dynamic_cast 和类型标识的 C++ 多态性
- 多态性和类型转换
- 如何使用基类指针调用派生类非虚拟成员函数,而无需类型转换和使用多态性
- 数据类型和多态性
- c++多态性和类型转换
- C++ 多态性和派生类类型 - "ugly programming"指针类型转换
- 根据"foreign"子类型采取特定操作,不带开关、强制转换等。我们可以以某种方式使用多态性吗?