如何在多态中访问定义在派生类而不是基类中的函数
How to access the function which is defined in derived class and not in base class in polymorphism
如何访问在派生类中定义的函数,而不是在多态性的基类中定义的函数?
class base {
public:
virtual void display ()
{
cout << "base" << endl;
}
};
class derived : public base {
public:
void display (){
cout << "Derived" << endl;
}
void goo (){
cout << " new function in derived" << endl;
}
};
base * global_function ( base *ptr)
{
/**** how to invoke the derived class goo function ---Here *****/
}
int main ()
{
derived obj;
global_function ( &obj );
}
谁能帮助我如何调用派生类函数,这是没有在基类中指定?
像这样:
Derived *d = dynamic_cast<Derived*>(ptr);
if (d) d->goo();
如果ptr
确实指向Derived
,dynamic_cast<Derived*>
将产生一个有效的Derived*
指针;否则,将产生NULL
指针(注意if
"保护"goo()
的调用)。
一般来说,过度使用dynamic_cast
不是一个好主意:如果你需要经常使用它,它指出了你的类层次结构设计中的一个潜在缺陷。
可以向下转换基指针
看这里,这包含了一个很好的解释做什么
摘自链接:
Child *p = dynamic_cast<Child *>(pParent);
您可以访问该方法,但您必须希望 base *ptr
实际上是derived*
类型(在您的情况下,它是)。
然后可以使用dynamic_cast
将指针转换为正确的类型:
derived* my_ptr = dynamic_cast<derived*>(ptr)
并使用my_ptr->goo()
调用该方法。如果my_ptr
的计算结果是nullptr
,那么ptr
不是正确的类型。您需要在调用goo
之前测试这个else,否则您可以调用未定义行为。
但是,这是一个绕过多态性的反模式。最好设置您的类结构,这样可以避免这种强制转换。
解决方案(不干净,不推荐)如下
base* global_function ( base *ptr ) {
std::dynamic_cast<Derived>(*ptr).goo();
}
虽然这在这种特殊情况下可能有效,但不要假设基类型指针包含关于foo的信息,而应该进行模板专门化并维护类型安全!
template <typename T>
T* global_function(const T* ptr) {
// do nothing in this case.
}
// Specialization
template<>
base* global_function<base>(const base* ptr) {
// invoke base methods
}
template<>
Derived* global_function<Derived>(const Derived* ptr) {
ptr->goo();
}
相关文章:
- 虚拟基类函数中派生类的大小
- 无法访问基类函数 C++
- 如何使派生类函数在调用时始终调用相同的基类函数?
- C++虚拟函数:基类函数是调用的,而不是派生的
- Qt基类函数定义
- 添加字符串类型的类成员会导致调用基类函数而不是子函数
- 有没有办法调用基类函数,该函数在使用私有继承的派生类中被覆盖?
- C++ - 基类函数指针调用的替代方法
- 什么更有效率?在重载函数中或通过在基类函数中检查对象类型来实现
- 重载基类函数是不好的做法吗?
- 在 qml 中公开基类函数
- 调用基类函数时强制使用类名?
- 如何判断哪个派生的类对象称为基类函数
- 获取具有基类函数的派生类
- 有没有办法从基类函数参数中推断出模板参数
- 私有非虚拟基类函数被称为派生类中的函数
- 模板基类函数成员的别名
- 如何用相同的签名从main调用基类函数
- C++ 如何从 main 调用派生的基类函数
- memcpy派生类到基类,为什么还调用基类函数