C++从已实现的虚拟类调用非虚拟方法

标签 c++ methods interface virtual

我有一个接口(interface)也有一个普通的方法,那我该如何调用它呢?

class Animal{
   virtual void virtualFunction()=0;
}

class Cow : Animal{
   virtual void virtualFunction(){}
   void nonVirtualFunction(){}
}

class main{
   Animal *a = new Cow();
   a->virtualFunction();
}

^:这行得通,但是当我这样做时...

a->nonVirtualFunction();

它说 Animal 类没有这个方法,我当然知道, 但是什么方式最好调用该方法

最佳答案

如果您要调用属于 Cow 成员的函数,请不要首先将其存储在多态 Animal 指针中:

Cow* c = new Cow();
c->nonVirtualFunction();

如果要在 Cow 中使用 Cow ,则将 Cow 存储在 Animal* 中没有意义-具体方式。

可以使用dynamic_cast 在运行时检查对象的动态类型:

Animal* a = new Cow();
if (Cow* c = dynamic_cast<Cow*>(a)) {
  c->nonVirtualFunction();
}

但是,这通常是糟糕设计的标志。

关于C++从已实现的虚拟类调用非虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15502302/

相关文章:

c++ - splice alternative - 从列表中移动元素而不从原始列表中删除它们

php - 对象的array_unique?

java - Kotlin 中接口(interface)的 Lambda 实现

c# - 获取对象调用层次结构

c# - 当只调用一次时,创建辅助方法是否仍然有意义?

java - 实现接口(interface)时扩展包含的类型

Laravel 5.0 应用结构

c++ - 编译C++,组织包含文件

c++ - 如何检测类型是否可以流式传输到 std::ostream?

c++ - glBlendFunc 和 alpha 混合