从基类指针调用派生的类方法
Calling derived class method from base class pointer
//Parent.h
class Parent
{
public:
virtual void foo() = 0;
};
//Child.h
class Child : public Parent
{
public:
virtual void foo(){cout << "inside function foo()" << endl;}
virtual void bar(){cout << "inside function bar()" << endl;};
};
int main( int argc, char** argv ){
Parent* pa = new Child;
pa->foo();
pa->bar(); //Error, class Parent have no member bar
return 0;
}
除了将这些功能添加到Parent
类
您可以将指针声明为儿童类型。您仍然能够将其传递到期望父母指针的功能。
其他解决方案涉及使用dynamic_cast<Child>(pa)
,尽管这通常被认为是不良设计需要的,因为它破坏了多态性应该完成的。
您可以使用static_cast或Dynamic_cast。用Dynamic_cast的示例:
if (Child* child = dynamic_cast<Child*>(pa))
child->bar();
首先在课堂设计中更加小心避免此错误。
是的,您可以使用dynamic_cast
或static_cast
将Base
指针施放为Derived
指针,如果类型相关,则像在此相关。但是,让我们考虑一下。
Q:为什么使用多态性? A:为相似操作提供不同的行为,在运行时选择该行为。
多态性用于从该操作的配置中抽象操作的实现。例如,所有Shape
s都有许多方面。多少方面取决于实际形状,但是我们不必知道哪种Shape
是什么样的东西来问它有多少个方面。我们应该只问它。
Q:为什么通常需要使用dynamic_cast
?
A:因为基本指针不提供您需要的设施。
如果我们不必关心哪种 Shape
某种对象才能执行我们需要的操作,那么为什么Shape
接口不提供我们需要的任何设施?
当我们在设计某些东西时犯了一个错误时,就会发生这种情况。 Shape
中的设施中没有足够的设施,或者某些特定的Shape
子类试图做更多的事情。
这就是您在这里所做的。如果Parent
在其上具有(public
)bar()
方法是没有意义的,那么Child
也不有意义。如果Child
具有bar
方法确实有意义,那么Child
实际上不是Parent
,是吗?
也许bar
应该是其他类别的方法。
首先,我们需要知道为什么编译器抱怨!如果有人告诉您修复程序,您将永远不会知道原因。首先了解原因。
您在编译过程中遇到错误。vTable
和vPtr
在early binding
期间没有出现图片。它在late binding
中出现。基类没有条形方法,因此编译器抱怨您是基于未知的基类调用的方法。因此,您需要将其输入到派生的类指针中,以使early binding
通过。我希望我对这个问题的理解是正确的。如果我错了,请纠正我。
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 从基类实例调用派生类方法而不进行强制转换
- C++ 使用派生类方法更改基类数据成员
- 将派生类方法与基类unique_ptr一起使用
- 使用基类对象访问派生的仅类方法
- C++:在派生类成员上调用基类方法
- 使用派生类C++方法的超类
- 无法访问派生类中的基类方法
- 哪个基类调用派生重写的方法?
- 有没有办法禁止派生类中的基类方法调用?
- 调用不属于基类的派生类函数的最佳方法是什么?
- 在派生类中调用基类方法,而无需指定基类名称
- 从库类扩展,然后如何让库调用派生类方法
- 如何模拟调用其基类方法的派生类
- 当应该调用派生类方法时,为什么要调用基类方法
- 从基类方法返回对派生类的引用
- 从具有相同基数的另一个派生类调用派生类的非 const 方法
- 无法从派生的一个方法调用基类方法
- 使用来自基类方法的派生类数据成员
- 传递指针或引用派生类,以便调用基类方法